前言起因:
我一個(gè)朋友因?yàn)橐粋€(gè)偶然機(jī)會(huì)赶么,獲得了一次去螞蟻金服面試的機(jī)會(huì)。怎么獲得這次機(jī)會(huì)的都是題外話脊串,這次我和我的這位朋友攀談交心聊了挺長時(shí)間的辫呻,現(xiàn)在我在這里把我從朋友這里得到的這份面試經(jīng)歷,及一些問題做出了總結(jié)來供大家參考琼锋,希望能對(duì)各位在找工作的朋友有一點(diǎn)兒幫助盯漂!
剛開始朋友還是有所顧慮的夺巩,因?yàn)楫吘故谴髲S,進(jìn)去應(yīng)該不容易裕坊,但是難得的一次機(jī)會(huì)狞甚,想想這也能增加自己的閱歷就打算去試試。
所以他一開始并沒有急著提交簡歷,而是說準(zhǔn)備下再提交簡歷。然后就準(zhǔn)備了一周搬葬,寫簡歷,刷題旗吁,在網(wǎng)上找螞蟻金服的面經(jīng)踩萎。提交了一份簡歷,然后發(fā)現(xiàn)簡歷上面沒有寫學(xué)歷很钓,幸好他還沒提交,就修改了下重新發(fā)了一份董栽,然后他又給我提了幾個(gè)建議码倦,所以又改了一版,才最終提交锭碳。
提交簡歷后的第二天下午袁稽,上班的時(shí)候螞蟻金服的面試官打電話過來了,說要面試擒抛,當(dāng)時(shí)正在上班推汽,就說了下不方便,就約了當(dāng)天晚上再面試歧沪。誰知道當(dāng)天小組因?yàn)閬砹诵氯舜跞觯砩弦鄄停詻]辦法诊胞,就厚著臉皮給面試官發(fā)了短信暖夭,說了下晚上臨時(shí)有事不能參加,想約下第二天或者周末撵孤。沒想到面試官很理解迈着,主要提出第二天晚上八點(diǎn)面試,短信上還讓我好好準(zhǔn)備邪码,好好加油裕菠。
有時(shí)間沖突的時(shí)候及時(shí)跟面試官溝通,往往第一面是技術(shù)面闭专,大家都是做技術(shù)的奴潘,能理解的。 平時(shí)多交點(diǎn)朋友往往會(huì)有意外的驚喜
面試正文:
電面一
第二天晚上六點(diǎn)多快七點(diǎn)的時(shí)候面試官提前打電話了喻圃,這天是周五幸好及時(shí)下班萤彩,原本是想著早點(diǎn)下班回去再準(zhǔn)備準(zhǔn)備,誰知道電話來的那么突然斧拍,剛點(diǎn)好晚飯雀扶,還沒來得及吃。既然電話都打來了,那就面唄愚墓,就到店外面面試了予权。
流程
1、2分鐘的自我介紹
大致講了自己的姓名浪册,畢業(yè)院校扫腺,哪年畢業(yè),個(gè)人愛好以及平時(shí)空閑時(shí)間做點(diǎn)什么村象,這個(gè)如實(shí)回答就好笆环。因?yàn)橹坝忻嬖囘^,所以準(zhǔn)備過厚者。建議可以自己提前寫下來躁劣,多說幾遍,找點(diǎn)感覺库菲。
2账忘、你自己認(rèn)為自己最熟悉的技術(shù)是什么?
這個(gè)就因人而異了熙宇,每個(gè)人熟悉的東西都不一樣鳖擒,一定要說自己最擅長的東西,不要給自己挖坑烫止。因?yàn)槊嬖嚬傧乱徊骄蜁?huì)根據(jù)你的回答進(jìn)行提問蒋荚。對(duì)于我來是,工作了幾年學(xué)的東西多而雜烈拒,沒有什么很深入的圆裕,但是總不能說沒有吧,所以就說了 Java 開發(fā)比較多荆几,所以 Java 語言熟悉多一點(diǎn)吓妆。然后面試官就說:“好,那我就問你一點(diǎn) Java 語言方面的吨铸⌒新#”
3、 HashMap 底層實(shí)現(xiàn)原理是什么诞吱?
這個(gè)作為一個(gè)面試必問的題目舟奠,所以我還是提前準(zhǔn)備過的,看過源碼房维。所以這個(gè)問題不是問題沼瘫,答完,面試官說回答的對(duì)了咙俩。
HashMap耿戚,HashTable湿故,ConcurrentHashMap 面試必備,針對(duì)1.7和1.8的不同實(shí)現(xiàn)加以說明膜蛔。包括底層的數(shù)據(jù)結(jié)構(gòu)坛猪,Hash 碰撞生成鏈表,Java8的鏈表轉(zhuǎn)紅黑樹皂股。
4墅茉、Java 的多線程有沒有使用過
根據(jù)自身情況,用過就用過呜呐,沒用過就沒有用過就斤。我回答有簡單的使用過,但是使用的場景不多蘑辑。面試官也就沒追問了战转,說了沒關(guān)系,就繼續(xù)以躯。
5、講一下線程池啄踊,以及實(shí)現(xiàn)固定大小線程池底層是如何實(shí)現(xiàn)的忧设?
講了下四中線程池,單一線程池颠通,固定大小線程池址晕,緩存線程池,定時(shí)線程池顿锰。但是關(guān)于固定大小線程池底層是如何實(shí)現(xiàn)的谨垃,回答的不好,面試官直接問底層的源碼是不是沒看過硼控,就說是的刘陶。面試官說沒關(guān)系。牢撼。匙隔。
追加:線程池底層都是通過ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue workQueue, ThreadFactory threadFactory, RejectedExecutionHandler handler)來實(shí)現(xiàn)的。
corePoolSize: 表示需要設(shè)置的線程個(gè)數(shù)熏版; maximumPoolSize: 線程池允許的最大線程個(gè)數(shù)纷责; keepAliveTime: 空閑線程存活的時(shí)間,超過這個(gè)時(shí)間就會(huì)被回收撼短; unit: 存活時(shí)間的單位再膳;workQueue: 需要執(zhí)行的任務(wù)隊(duì)列。threadFactory: 線程工廠曲横,用于創(chuàng)建線程喂柒,一般用默認(rèn)的即可; handler: 拒絕策略,當(dāng)任務(wù)太多來不及處理胳喷,如何拒絕任務(wù)湃番; 拒絕策略: 直接丟棄(DiscardPolicy) 丟棄隊(duì)列中最老的任務(wù)(DiscardOldestPolicy) 拋異常(AbortPolicy) 將任務(wù)分給調(diào)用線程來執(zhí)行(CallerRunsPolicy)
6、Redis 為什么這么高效吭露,使用的場景是什么吠撮?
回答了一下我們使用 redis 做緩存和登錄 session 存在的場景,以及 redis 是單線程的讲竿。
1泥兰、完全基于內(nèi)存,大多數(shù)請(qǐng)求都是內(nèi)存操作题禀,非承快速;
2迈嘹、數(shù)據(jù)結(jié)構(gòu)簡單削彬,操作簡單;
3秀仲、采用單線程融痛,避免了不必要的上下文切換和競爭條件,不存在多進(jìn)程或者多線程的切換神僵,不用考慮鎖帶來的性能消耗雁刷;
4、使用多路 I/O復(fù)用模型保礼,非阻塞 IO
7沛励、分布式服務(wù)是否了解,zookeeper炮障,dubbo 是否使用過目派?
關(guān)于 zk 和 dubbo 這塊用的不多,zk 主要是在使用 kafka 的時(shí)候會(huì)用到铝阐,但是不涉及原理上面的研究址貌。dubbo 雖然項(xiàng)目中有用過,但是并不是很深入徘键,就沒說用過练对,直接說沒用過。
8吹害、冪等概念有沒有了解過
冪等性是數(shù)學(xué)上的含義是對(duì)于參數(shù) x螟凭,f(x)=f(f(x));比如絕對(duì)值函數(shù)。 在分布式環(huán)境下表示的是對(duì)于同樣的請(qǐng)求它呀,在一次或者多次請(qǐng)求的情況下對(duì)系統(tǒng)的使用資源是一樣的螺男。保證失敗重試不會(huì)導(dǎo)致提交兩次棒厘。 方法: 帶版本號(hào)的方式; 采用數(shù)據(jù)庫唯一索引方式下隧;
9奢人、常用的數(shù)據(jù)庫是什么?
我們常用的數(shù)據(jù)庫是 MySQL淆院,所以就回答了 MySQL何乎。
10、MySQL 的事務(wù)特性有哪些土辩?
?首先事務(wù)是作為單個(gè)邏輯工作單元執(zhí)行的一系列操作支救,這些操作作為一個(gè)整體一起向系統(tǒng)提交,要么都執(zhí)行拷淘,要么都不執(zhí)行各墨。事務(wù)是一個(gè)不可分割的邏輯單元。?A(原子性)事務(wù)的各步操作是不可分的启涯,保證一系列的操作要么都完成贬堵,要么都不完成;?C(一致性)事務(wù)完成结洼,數(shù)據(jù)必須處于一致的狀態(tài)扁瓢;?I(隔離性)對(duì)數(shù)據(jù)進(jìn)行修改的所有并發(fā)事務(wù)彼此之間是相互隔離,這表明事務(wù)必須是獨(dú)立的补君,不應(yīng)以任何方式依賴或影響其他事務(wù);?D(持久性)表示事務(wù)對(duì)數(shù)據(jù)處理結(jié)束后昧互,對(duì)數(shù)據(jù)更改必須持久化挽铁,不管是事務(wù)成功還是回滾。事務(wù)日志都能夠保持事務(wù)的永久性敞掘。
11叽掘、如果現(xiàn)在一臺(tái)生產(chǎn)的數(shù)據(jù)庫掛了怎么處理?
首先這題沒有 get 的面試官想問的點(diǎn)是什么玖雁,所以就根據(jù)自己項(xiàng)目本身的情況做答了更扁。我們項(xiàng)目生產(chǎn)上的數(shù)據(jù)庫是有主備的,在主數(shù)據(jù)庫掛掉的情況下是會(huì)切換到備數(shù)據(jù)庫赫冬,先保證業(yè)務(wù)的穩(wěn)定性浓镜,然后在對(duì)崩潰現(xiàn)場進(jìn)行保留,方便后續(xù)分析問題劲厌,找到原因膛薛。這里面試官追問了一下,我們主備的切換是自動(dòng)的還是手動(dòng)的补鼻,這個(gè)由于是公司運(yùn)維團(tuán)隊(duì)負(fù)責(zé)的哄啄,自己本身不是特別清楚雅任,但是根據(jù)對(duì)公司運(yùn)維團(tuán)隊(duì)的了解,應(yīng)該是自動(dòng)的咨跌。所以就這樣如實(shí)的回答了沪么。
12、數(shù)據(jù)庫如何實(shí)現(xiàn) rollback 的锌半?
數(shù)據(jù)庫在寫入數(shù)據(jù)之前是先講對(duì)數(shù)據(jù)的改動(dòng)寫入 redo log 和 undo log禽车,然后在操作數(shù)據(jù),如果成功提交事務(wù)就會(huì)講操作寫入磁盤拳喻;如果失敗就會(huì)根據(jù)redo log 和 undo log 逆向還原到事務(wù)操作之前的狀態(tài)哭当。
13、工作這么久你遇到的最難的技術(shù)點(diǎn)是什么冗澈?
我這邊根據(jù)具體的工具經(jīng)理钦勘,回答的是 kafka 的初次使用,因?yàn)楫?dāng)時(shí)是公司內(nèi)部第一個(gè)引入 kafka亚亲,之前沒有小組使用過彻采,所以要采很多坑。并且那個(gè)時(shí)候 kafka 還沒有發(fā)布1.0版本捌归,官網(wǎng)和網(wǎng)上提供的版本很雜亂不兼容肛响。
14、用過Kafka 的話說下 Kafka優(yōu)缺點(diǎn)有哪些惜索?
?Kafka 是一個(gè)高吞吐量的消息隊(duì)列特笋。基本的組件有生產(chǎn)者巾兆,消費(fèi)者猎物,node 節(jié)點(diǎn),生產(chǎn)者負(fù)責(zé)生產(chǎn)消息角塑,將消息發(fā)送到指定的 topic 或者 partition 當(dāng)中蔫磨。?每個(gè) partition 可以有多個(gè)分區(qū)副本,并且存放在不同的 broker 節(jié)點(diǎn)上圃伶,保證數(shù)據(jù)的安全堤如。partiton 的底層是根據(jù) segment 段存放的一系列日志文件,文件里面存放的具體的消息內(nèi)容窒朋,每條消息都有一個(gè)唯一的 offset 偏移量搀罢,并且是按照磁盤順序存放的。由于磁盤是順序讀寫侥猩,所以 kafka 可以有很高的吞吐量魄揉。磁盤的順序讀寫比隨機(jī)讀寫的性能高很多。?每個(gè)消費(fèi)者都屬于一個(gè)消費(fèi)者組拭宁,可以消費(fèi)指定 topic 下的數(shù)據(jù)洛退。
15瓣俯、TCP/IP 協(xié)議是如何保證數(shù)據(jù)可靠性的?
首先 TCP是面向連接的傳輸協(xié)議兵怯。主要通過消息確認(rèn)和重試機(jī)制來保證數(shù)據(jù)傳輸?shù)目煽啃浴?/p>
電面二
二面的時(shí)間是在第二周彩匕,周四下午的時(shí)候打電話過來,問是否可以面試媒区。但是當(dāng)時(shí)在上班就說不方便驼仪,能否周五晚上面試。面試官說可以袜漩。誰知道绪爸,第二天中午還沒下班就打電話過來說面試,可能本來周五大家各自事情都多吧宙攻,他也想盡快搞完奠货。我這邊被突然的面試電話給搞懵了一下,想著不是約好了晚上么座掘,怎么搞突擊递惋。。溢陪。但是沒辦法萍虽,已經(jīng)推過一次,沒好意思再推掉形真。就說了我要找個(gè)安靜地方杉编,稍等下。
整個(gè)面試過程不是很好咆霜,主要是在公司內(nèi)部找了個(gè)沒人的地方王财,說話聲音都不敢大,而且還經(jīng)常有人經(jīng)過裕便,來來回回的。感覺這點(diǎn)沒有決策好见咒,也是這次的一個(gè)遺憾偿衰。所以大家電話面試的時(shí)候一定要找個(gè)沒人的地方。
流程
1改览、先進(jìn)行自我介紹下翎,然后介紹自己做過的項(xiàng)目,從項(xiàng)目流程架構(gòu)設(shè)計(jì)等方面介紹
根據(jù)個(gè)人經(jīng)歷說了自己所做的項(xiàng)目宝当,以及流程和架構(gòu)方面视事,因?yàn)槭亲约簠⑴c的項(xiàng)目,所以整個(gè)流程說的還是很流暢的庆揩。畢竟自己很熟悉俐东。這塊盡量多從幾個(gè)方面講跌穗,流程,架構(gòu)虏辫,設(shè)計(jì)等蚌吸。
2、HashMap 的查詢時(shí)間復(fù)雜度
理想情況下是 O(1)的砌庄,但是實(shí)際中會(huì)出現(xiàn) hash 碰撞羹唠,導(dǎo)致無法達(dá)到效果。
3娄昆、LinkedList和ArrayList的區(qū)別
LinkedList 底層是基于雙向鏈表實(shí)現(xiàn)的佩微,而 ArrayList 底層是基于動(dòng)態(tài)數(shù)組實(shí)現(xiàn)的;
查詢的時(shí)候 LinkedList 的效率要低于 ArrayList萌焰,因?yàn)?LinkedList 需要遍歷鏈表哺眯,而 ArrayList 底層數(shù)組根據(jù)下標(biāo)直接獲取數(shù)據(jù)。
插入刪除數(shù)據(jù)的時(shí)候杆怕,LinkedList 效率比ArrayList 效率高族购,因?yàn)?ArrayList 在數(shù)據(jù)多的情況下會(huì)進(jìn)行數(shù)組擴(kuò)容或移動(dòng)數(shù)組。
多進(jìn)程與多線程在編程上面有什么需要注意的
首先進(jìn)程是資源分配的最小單元陵珍,線程是任務(wù)調(diào)度的最小單元
對(duì)比維度 多進(jìn)程 多線程 總結(jié)
數(shù)據(jù)共享寝杖、同步 數(shù)據(jù)共享復(fù)雜,需要用IPC互纯;數(shù)據(jù)是分開的瑟幕,同步簡單 因?yàn)楣蚕磉M(jìn)程數(shù)據(jù),數(shù)據(jù)共享簡單留潦,但也是因?yàn)檫@個(gè)原因?qū)е峦綇?fù)雜 各有優(yōu)勢(shì)
內(nèi)存只盹、CPU 占用內(nèi)存多,切換復(fù)雜兔院,CPU利用率低 占用內(nèi)存少殖卑,切換簡單,CPU利用率高 線程占優(yōu)
創(chuàng)建銷毀坊萝、切換 創(chuàng)建銷毀孵稽、切換復(fù)雜,速度慢 創(chuàng)建銷毀十偶、切換簡單菩鲜,速度很快 線程占優(yōu)
編程、調(diào)試 編程簡單惦积,調(diào)試簡單 編程復(fù)雜接校,調(diào)試復(fù)雜 進(jìn)程占優(yōu)
可靠性 進(jìn)程間不會(huì)互相影響 一個(gè)線程掛掉將導(dǎo)致整個(gè)進(jìn)程掛掉 進(jìn)程占優(yōu)
分布式 適應(yīng)于多核、多機(jī)分布式狮崩;如果一臺(tái)機(jī)器不夠蛛勉,擴(kuò)展到多臺(tái)機(jī)器比較簡單 適應(yīng)于多核分布式 進(jìn)程占優(yōu)
5鹿寻、ThreadLocal的使用場景
ThreadLocal 適用于每個(gè)線程需要自己獨(dú)立的實(shí)例且該實(shí)例需要在多個(gè)方法中被使用,也即變量在線程間隔離而在方法或類間共享的場景董习。
6烈和、堆內(nèi)存和棧內(nèi)存有什么區(qū)別
堆內(nèi)存是線程共享的,棧內(nèi)存是線程私有的皿淋;
堆內(nèi)存用來存放由new創(chuàng)建的對(duì)象和數(shù)組招刹,棧內(nèi)存中存放一些基本類型的變量和對(duì)象的引用變量;
7窝趣、堆排序時(shí)間復(fù)雜度
排序名稱 穩(wěn)定性 平均時(shí)間復(fù)雜度 最好時(shí)間復(fù)雜度 最壞時(shí)間復(fù)雜度
桶排序 不穩(wěn)定 O(n) O(n) O(n)
基數(shù)排序 穩(wěn)定 O(n) O(n) O(n)
歸并排序 穩(wěn)定 O(nlogn) O(nlogn) O(nlogn)
快速排序 不穩(wěn)定 O(nlogn) O(nlogn) O(n^2)
堆排序 不穩(wěn)定 O(nlogn) O(nlogn) O(nlogn)
冒泡排序 穩(wěn)定 O(n^2) O(n) O(n^2)
選擇排序 不穩(wěn)定 O(n^2) O(n^2) O(n^2)
8疯暑、如果優(yōu)化數(shù)據(jù)庫的數(shù)據(jù)查詢,另外應(yīng)用層上還能如何優(yōu)化哑舒?
1)數(shù)據(jù)庫層面上:
除了主鍵索引妇拯,唯一索引之外,對(duì)于常用的查詢字段也要加索引洗鸵。查詢的時(shí)候盡量使用主鍵索引越锈,因?yàn)镸ySQL 的 InnoDB
的主鍵索引索引的是整行數(shù)據(jù),而普通索引索引的是主鍵膘滨,會(huì)有回表操作甘凭。當(dāng)然索引并不是越多越好,索引固然可以提高相應(yīng)的 select
的效率火邓,但同時(shí)也降低了 insert 及 update 的效率丹弱,需要酌情考慮。 2铲咨、優(yōu)化查詢語句躲胳,盡量采用確認(rèn)性查詢語句,減少
or纤勒,in坯苹,not in,%xxx%語法的使用摇天。
2)應(yīng)用層面上:
采用緩存機(jī)制粹湃,將常用的數(shù)據(jù)進(jìn)行緩存,增加訪問速度闸翅; 分庫分表,讀寫分離菊霜,將數(shù)據(jù)分開讀寫坚冀,提升性能
9、強(qiáng)一致性鉴逞,弱一致性记某,最終一致性
強(qiáng)一致性:對(duì)于更新后的數(shù)據(jù)司训,要求后續(xù)所有節(jié)點(diǎn)的任何操作都要獲取最新值的情況;
弱一致性:對(duì)于更新后的數(shù)據(jù)液南,后續(xù)節(jié)點(diǎn)的數(shù)據(jù)操作可以是新值壳猜,也可以是舊值,通過一段時(shí)間后后續(xù)節(jié)點(diǎn)對(duì)數(shù)據(jù)的操作都是新值滑凉;
最終一致性:是弱一致性的特殊形式统扳,存儲(chǔ)系統(tǒng)保證在沒有新的更新的條件下,最終所有的訪問都是最后更新的值畅姊。
10咒钟、有一個(gè)一百萬行的文件,內(nèi)部是購買的商品ID若未,如何獲取到購買最多的前一百個(gè)商品朱嘴。
思路:首先考察的肯定是大數(shù)據(jù)處理方案,這些數(shù)據(jù)肯定不能一次性讀取到內(nèi)存粗合,那就需要拆分萍嬉,將數(shù)據(jù)分隔處理。假設(shè)要分隔為 n 個(gè)文件隙疚。
分隔:如果 ID 是整型的話壤追,可以直接采用取模(id % n)的方式;如果 ID 是字符串可以先計(jì)算 hash 值然后再取模(hash(x) % n)的方式甚淡,將相同 ID 的商品分到同一個(gè)文件中大诸。
針對(duì)每個(gè)小文件進(jìn)行 top100的排序,返回購買最多的100個(gè)商品 ID?根據(jù) n 個(gè)文件中的100個(gè) ID贯卦,在進(jìn)行一次排序资柔,即可得到需要的數(shù)據(jù)。
小結(jié)
然后說下這次他的面試體驗(yàn)撵割,總得來說贿堰,感覺不是很好,因?yàn)閹状未螂娫挾际窃诠旧习嗥陂g啡彬,畢竟在公司接到面試電話還是很不好的羹与。沒有按照約定的時(shí)間點(diǎn)打電話
他說:“身為一個(gè)目前在職三年,工作在深圳這樣的大環(huán)境下庶灿,還是有很大壓力的纵搁。以前上學(xué)的時(shí)候想著什么時(shí)候能月入過萬應(yīng)該就不愁什么的,但是漸漸的發(fā)現(xiàn)往踢,及時(shí)月入過萬也還是過不好生活腾誉。周圍比你厲害比你強(qiáng)的人多了去了,你能做的就只有不斷的學(xué)習(xí),不斷的進(jìn)步利职∪ばВ”
本人寫的這些若是能幫到大家真的是太好不過了,希望各位成功早日實(shí)現(xiàn)自己的目標(biāo)猪贪!
最后
近段時(shí)間本人將一些各大廠商的面試題和今年(2020)最新資料的收集跷敬,以下是部分資料截圖(所有資料均已整合成文檔,pdf壓縮打包處理)热押。
如有有需要的朋友可以點(diǎn)擊這里來獲取資料西傀,暗號(hào):KY