記一次螞蟻金服的面試經(jīng)歷(小結(jié))

2015在實(shí)習(xí)的時(shí)候,當(dāng)時(shí)一個(gè)一起實(shí)習(xí)的朋友在2019年3月份的時(shí)候突然在微信上找我,問(wèn)我要不要面試下螞蟻金服。問(wèn)了下相關(guān)信息才知道他在2018年11月的時(shí)候進(jìn)到螞蟻金服,現(xiàn)在招人就想到了我,問(wèn)我要不要試一下。
剛開始還是有所顧慮的,因?yàn)楫吘故谴髲S,進(jìn)去應(yīng)該不容易,但是這個(gè)朋友進(jìn)去了,想想應(yīng)該也沒(méi)有很難吧,畢竟當(dāng)時(shí)實(shí)習(xí)的時(shí)候,他技術(shù)并不怎么樣。但是畢竟過(guò)去好幾年了,現(xiàn)在人家可能變厲害了。
所以一開始并沒(méi)有急著提交簡(jiǎn)歷,而是說(shuō)準(zhǔn)備下再提交簡(jiǎn)歷。然后就準(zhǔn)備了一周,寫簡(jiǎn)歷,刷題,在網(wǎng)上找螞蟻金服的面經(jīng)。提交了一份簡(jiǎn)歷,然后發(fā)現(xiàn)簡(jiǎn)歷上面沒(méi)有寫學(xué)歷,幸好他還沒(méi)提交,就修改了下重新發(fā)了一份,然后他又給我提了幾個(gè)建議,所以又改了一版,才最終提交。
提交簡(jiǎn)歷后的第二天下午,上班的時(shí)候螞蟻金服的面試官打電話過(guò)來(lái)了,說(shuō)要面試,當(dāng)時(shí)正在上班,就說(shuō)了下不方便,就約了當(dāng)天晚上再面試。誰(shuí)知道當(dāng)天小組因?yàn)閬?lái)了新人,晚上要聚餐,所以沒(méi)辦法,就厚著臉皮給面試官發(fā)了短信,說(shuō)了下晚上臨時(shí)有事不能參加,想約下第二天或者周末。沒(méi)想到面試官很理解,主要提出第二天晚上八點(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)備,誰(shuí)知道電話來(lái)的那么突然,剛點(diǎn)好晚飯,還沒(méi)來(lái)得及吃。既然電話都打來(lái)了,那就面唄,就到店外面面試了。
流程
1、2分鐘的自我介紹
大致講了自己的姓名,畢業(yè)院校,哪年畢業(yè),個(gè)人愛好以及平時(shí)空閑時(shí)間做點(diǎn)什么,這個(gè)如實(shí)回答就好。因?yàn)橹坝忻嬖囘^(guò),所以準(zhǔn)備過(guò)。建議可以自己提前寫下來(lái),多說(shuō)幾遍,找點(diǎn)感覺。
2、你自己認(rèn)為自己最熟悉的技術(shù)是什么?
這個(gè)就因人而異了,每個(gè)人熟悉的東西都不一樣,一定要說(shuō)自己最擅長(zhǎng)的東西,不要給自己挖坑。因?yàn)槊嬖嚬傧乱徊骄蜁?huì)根據(jù)你的回答進(jìn)行提問(wèn)。對(duì)于我來(lái)是,工作了幾年學(xué)的東西多而雜,沒(méi)有什么很深入的,但是總不能說(shuō)沒(méi)有吧,所以就說(shuō)了 Java 開發(fā)比較多,所以 Java 語(yǔ)言熟悉多一點(diǎn)。然后面試官就說(shuō):“好,那我就問(wèn)你一點(diǎn) Java 語(yǔ)言方面的。”
3、 HashMap 底層實(shí)現(xiàn)原理是什么?
這個(gè)作為一個(gè)面試必問(wèn)的題目,所以我還是提前準(zhǔn)備過(guò)的,看過(guò)源碼。所以這個(gè)問(wèn)題不是問(wèn)題,答完,面試官說(shuō)回答的對(duì)了。
HashMap,HashTable,ConcurrentHashMap 面試必備,針對(duì)1.7和1.8的不同實(shí)現(xiàn)加以說(shuō)明。包括底層的數(shù)據(jù)結(jié)構(gòu),Hash 碰撞生成鏈表,Java8的鏈表轉(zhuǎn)紅黑樹。
4、Java 的多線程有沒(méi)有使用過(guò)
根據(jù)自身情況,用過(guò)就用過(guò),沒(méi)用過(guò)就沒(méi)有用過(guò)。我回答有簡(jiǎn)單的使用過(guò),但是使用的場(chǎng)景不多。面試官也就沒(méi)追問(wèn)了,說(shuō)了沒(méi)關(guān)系,就繼續(xù)。
5、講一下線程池,以及實(shí)現(xiàn)固定大小線程池底層是如何實(shí)現(xiàn)的?
講了下四中線程池,單一線程池,固定大小線程池,緩存線程池,定時(shí)線程池。但是關(guān)于固定大小線程池底層是如何實(shí)現(xiàn)的,回答的不好,面試官直接問(wèn)底層的源碼是不是沒(méi)看過(guò),就說(shuō)是的。面試官說(shuō)沒(méi)關(guān)系。。。
追加:線程池底層都是通過(guò)ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, ThreadFactory threadFactory, RejectedExecutionHandler handler)來(lái)實(shí)現(xiàn)的。
corePoolSize: 表示需要設(shè)置的線程個(gè)數(shù); maximumPoolSize: 線程池允許的最大線程個(gè)數(shù); keepAliveTime: 空閑線程存活的時(shí)間,超過(guò)這個(gè)時(shí)間就會(huì)被回收; unit: 存活時(shí)間的單位;workQueue: 需要執(zhí)行的任務(wù)隊(duì)列。threadFactory: 線程工廠,用于創(chuàng)建線程,一般用默認(rèn)的即可; handler: 拒絕策略,當(dāng)任務(wù)太多來(lái)不及處理,如何拒絕任務(wù); 拒絕策略: 直接丟棄(DiscardPolicy) 丟棄隊(duì)列中最老的任務(wù)(DiscardOldestPolicy) 拋異常(AbortPolicy) 將任務(wù)分給調(diào)用線程來(lái)執(zhí)行(CallerRunsPolicy)
6、Redis 為什么這么高效,使用的場(chǎng)景是什么?
回答了一下我們使用 redis 做緩存和登錄 session 存在的場(chǎng)景,以及 redis 是單線程的。
1、完全基于內(nèi)存,大多數(shù)請(qǐng)求都是內(nèi)存操作,非??焖伲?2、數(shù)據(jù)結(jié)構(gòu)簡(jiǎn)單,操作簡(jiǎn)單; 3、采用單線程,避免了不必要的上下文切換和競(jìng)爭(zhēng)條件,不存在多進(jìn)程或者多線程的切換,不用考慮鎖帶來(lái)的性能消耗; 4、使用多路 I/O復(fù)用模型,非阻塞 IO
7、分布式服務(wù)是否了解,zookeeper,dubbo 是否使用過(guò)?
關(guān)于 zk 和 dubbo 這塊用的不多,zk 主要是在使用 kafka 的時(shí)候會(huì)用到,但是不涉及原理上面的研究。dubbo 雖然項(xiàng)目中有用過(guò),但是并不是很深入,就沒(méi)說(shuō)用過(guò),直接說(shuō)沒(méi)用過(guò)。
8、冪等概念有沒(méi)有了解過(guò)
冪等性是數(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ù)庫(kù)唯一索引方式;
9、常用的數(shù)據(jù)庫(kù)是什么?
我們常用的數(shù)據(jù)庫(kù)是 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ù)庫(kù)掛了怎么處理?
首先這題沒(méi)有 get 的面試官想問(wèn)的點(diǎn)是什么,所以就根據(jù)自己項(xiàng)目本身的情況做答了。我們項(xiàng)目生產(chǎn)上的數(shù)據(jù)庫(kù)是有主備的,在主數(shù)據(jù)庫(kù)掛掉的情況下是會(huì)切換到備數(shù)據(jù)庫(kù),先保證業(yè)務(wù)的穩(wěn)定性,然后在對(duì)崩潰現(xiàn)場(chǎng)進(jìn)行保留,方便后續(xù)分析問(wèn)題,找到原因。這里面試官追問(wèn)了一下,我們主備的切換是自動(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ù)庫(kù)如何實(shí)現(xiàn) rollback 的?
數(shù)據(jù)庫(kù)在寫入數(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,之前沒(méi)有小組使用過(guò),所以要采很多坑。并且那個(gè)時(shí)候 kafka 還沒(méi)有發(fā)布1.0版本,官網(wǎng)和網(wǎng)上提供的版本很雜亂不兼容。
14、用過(guò)Kafka 的話說(shuō)下 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é)議。主要通過(guò)消息確認(rèn)和重試機(jī)制來(lái)保證數(shù)據(jù)傳輸?shù)目煽啃浴?/p>
電面二
二面的時(shí)間是在第二周,周四下午的時(shí)候打電話過(guò)來(lái),問(wèn)是否可以面試。但是當(dāng)時(shí)在上班就說(shuō)不方便,能否周五晚上面試。面試官說(shuō)可以。誰(shuí)知道,第二天中午還沒(méi)下班就打電話過(guò)來(lái)說(shuō)面試,可能本來(lái)周五大家各自事情都多吧,他也想盡快搞完。我這邊被突然的面試電話給搞懵了一下,想著不是約好了晚上么,怎么搞突擊。。。但是沒(méi)辦法,已經(jīng)推過(guò)一次,沒(méi)好意思再推掉。就說(shuō)了我要找個(gè)安靜地方,稍等下。
整個(gè)面試過(guò)程不是很好,主要是在公司內(nèi)部找了個(gè)沒(méi)人的地方,說(shuō)話聲音都不敢大,而且還經(jīng)常有人經(jīng)過(guò),來(lái)來(lái)回回的。感覺這點(diǎn)沒(méi)有決策好,也是這次的一個(gè)遺憾。所以大家電話面試的時(shí)候一定要找個(gè)沒(méi)人的地方。
流程
1、先進(jìn)行自我介紹,然后介紹自己做過(guò)的項(xiàng)目,從項(xiàng)目流程架構(gòu)設(shè)計(jì)等方面介紹
根據(jù)個(gè)人經(jīng)歷說(shuō)了自己所做的項(xiàng)目,以及流程和架構(gòu)方面,因?yàn)槭亲约簠⑴c的項(xiàng)目,所以整個(gè)流程說(shuō)的還是很流暢的。畢竟自己很熟悉。這塊盡量多從幾個(gè)方面講,流程,架構(gòu),設(shè)計(jì)等。
2、HashMap 的查詢時(shí)間復(fù)雜度
理想情況下是 O(1)的,但是實(shí)際中會(huì)出現(xiàn) hash 碰撞,導(dǎo)致無(wú)法達(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ù)是分開的,同步簡(jiǎn)單 | 因?yàn)楣蚕磉M(jìn)程數(shù)據(jù),數(shù)據(jù)共享簡(jiǎn)單,但也是因?yàn)檫@個(gè)原因?qū)е峦綇?fù)雜 | 各有優(yōu)勢(shì) |
內(nèi)存、CPU | 占用內(nèi)存多,切換復(fù)雜,CPU利用率低 | 占用內(nèi)存少,切換簡(jiǎn)單,CPU利用率高 | 線程占優(yōu) |
創(chuàng)建銷毀、切換 | 創(chuàng)建銷毀、切換復(fù)雜,速度慢 | 創(chuàng)建銷毀、切換簡(jiǎn)單,速度很快 | 線程占優(yōu) |
編程、調(diào)試 | 編程簡(jiǎn)單,調(diào)試簡(jiǎn)單 | 編程復(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ī)器比較簡(jiǎn)單 | 適應(yīng)于多核分布式 | 進(jìn)程占優(yōu) |
5、ThreadLocal的使用場(chǎng)景
ThreadLocal 適用于每個(gè)線程需要自己獨(dú)立的實(shí)例且該實(shí)例需要在多個(gè)方法中被使用,也即變量在線程間隔離而在方法或類間共享的場(chǎng)景。
6、堆內(nèi)存和棧內(nèi)存有什么區(qū)別
- 堆內(nèi)存是線程共享的,棧內(nèi)存是線程私有的;
- 堆內(nèi)存用來(lá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ù)庫(kù)的數(shù)據(jù)查詢,另外應(yīng)用層上還能如何優(yōu)化?
1)數(shù)據(jù)庫(kù)層面上:
除了主鍵索引,唯一索引之外,對(duì)于常用的查詢字段也要加索引。查詢的時(shí)候盡量使用主鍵索引,因?yàn)镸ySQL 的 InnoDB 的主鍵索引索引的是整行數(shù)據(jù),而普通索引索引的是主鍵,會(huì)有回表操作。當(dāng)然索引并不是越多越好,索引固然可以提高相應(yīng)的 select 的效率,但同時(shí)也降低了 insert 及 update 的效率,需要酌情考慮。 2、優(yōu)化查詢語(yǔ)句,盡量采用確認(rèn)性查詢語(yǔ)句,減少 or,in,not in,%xxx%語(yǔ)法的使用。
2)應(yīng)用層面上:
- 采用緩存機(jī)制,將常用的數(shù)據(jù)進(jìn)行緩存,增加訪問(wèn)速度;
- 分庫(kù)分表,讀寫分離,將數(shù)據(jù)分開讀寫,提升性能
9、強(qiáng)一致性,弱一致性,最終一致性
- 強(qiáng)一致性:對(duì)于更新后的數(shù)據(jù),要求后續(xù)所有節(jié)點(diǎn)的任何操作都要獲取最新值的情況;
- 弱一致性:對(duì)于更新后的數(shù)據(jù),后續(xù)節(jié)點(diǎn)的數(shù)據(jù)操作可以是新值,也可以是舊值,通過(guò)一段時(shí)間后后續(xù)節(jié)點(diǎn)對(duì)數(shù)據(jù)的操作都是新值;
- 最終一致性:是弱一致性的特殊形式,存儲(chǔ)系統(tǒng)保證在沒(méi)有新的更新的條件下,最終所有的訪問(wèn)都是最后更新的值。
10、有一個(gè)一百萬(wàn)行的文件,內(nèi)部是購(gòu)買的商品ID,如何獲取到購(gòu)買最多的前一百個(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的排序,返回購(gòu)買最多的100個(gè)商品 ID•根據(jù) n 個(gè)文件中的100個(gè) ID,在進(jìn)行一次排序,即可得到需要的數(shù)據(jù)。
小結(jié)
首先很感謝內(nèi)推的那個(gè)朋友才有了這次的面試機(jī)會(huì),雖然結(jié)果不盡人意,但是為自己的學(xué)習(xí)成長(zhǎng)之旅增加了一些精彩。
然后說(shuō)下這次的面試體驗(yàn),總得來(lái)說(shuō),感覺不是很好,因?yàn)閹状未螂娫挾际窃诠旧习嗥陂g,畢竟在公司接到面試電話還是很不好的。沒(méi)有按照約定的時(shí)間點(diǎn)打電話,可能是我接觸的少,不知道其他公司是怎么樣的,總覺得這樣不太好。
身為一個(gè)目前在職三年,工作在深圳這樣的大環(huán)境下,還是有很大壓力的。以前上學(xué)的時(shí)候想著什么時(shí)候能月入過(guò)萬(wàn)應(yīng)該就不愁什么的,但是漸漸的發(fā)現(xiàn),及時(shí)月入過(guò)萬(wàn)也還是過(guò)不好生活。周圍比你厲害比你強(qiáng)的人多了去了,你能做的就只有不斷的學(xué)習(xí),不斷的進(jìn)步。
到此這篇關(guān)于記一次螞蟻金服的面試經(jīng)歷(小結(jié))的文章就介紹到這了,更多相關(guān)螞蟻金服面試內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持腳本之家!
相關(guān)文章
- 這篇文章主要介紹了阿里(菜鳥,天貓,螞蟻金服)面試后的題目總匯,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小2020-04-01
螞蟻金服+拼多多+抖音+天貓Java面經(jīng)合集(一次性查缺補(bǔ)漏個(gè)夠)
這篇文章主要介紹了螞蟻金服+拼多多+抖音+天貓Java面經(jīng)合集(一次性查缺補(bǔ)漏個(gè)夠),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2019-09-18