記一次阿里巴巴一面經(jīng)歷,作為一名java程序員終于找到了自己差距!

記一次阿里巴巴一面經(jīng)歷,作為一名java程序員終于找到了自己差距

面試前的故事

上周在拉勾上收到一個(gè)螞蟻金服的大哥要我的簡(jiǎn)歷,當(dāng)時(shí)很驚訝,居然有螞蟻金服的找到我,然后想都沒(méi)想就給了。

受寵若驚呀,我知道自己的水平跟阿里的差距有多遠(yuǎn),以前一直沒(méi)用勇氣去投,連試試都不敢。這次居然主動(dòng)找過(guò)來(lái)了,當(dāng)時(shí)就再想,難道阿里這么缺人么?還是只是為了完成某些KPI,當(dāng)然了,我這種想法比較幼稚。

沒(méi)想到的是第二天居然收到了阿里巴巴的面試邀請(qǐng)郵件,里面說(shuō)到會(huì)在10個(gè)工作日內(nèi)進(jìn)行第一次面試。

不管怎么樣吧,既然面試來(lái)了,就試試吧。能面一次這種級(jí)別的技術(shù)公司,看看自己真實(shí)的差距,也是三生有幸了。從離職的這段時(shí)間也補(bǔ)了補(bǔ)JVM,基礎(chǔ)的數(shù)據(jù)結(jié)構(gòu)算法什么的,還有一些高頻的Java 基礎(chǔ)問(wèn)題。

周一晚上 8:25 接到了螞蟻大哥來(lái)的電話,果然,跟傳說(shuō)中的一樣,還在上班。當(dāng)時(shí)很意外,沒(méi)想到是電話面試,因?yàn)猷]件中沒(méi)提到,后面回想,貌似一面基本上都是電話面試,有些朋友二面也是電面。

進(jìn)入正題,下面是整個(gè)內(nèi)容。順序有些不一致,我按照模塊來(lái)整理的。

記一次阿里巴巴一面經(jīng)歷,作為一名java程序員終于找到了自己差距

自我介紹

自我介紹就先介紹 多大了、畢業(yè)多久了、做了什么些東西、最近做的什么內(nèi)容,擅長(zhǎng)的部分呀 等等。

這里說(shuō)一下,自我介紹的內(nèi)容如實(shí)說(shuō)就好,不要太過(guò)于夸大,自我介紹的內(nèi)容建議大家提前準(zhǔn)備好,不要說(shuō)的時(shí)候想到哪兒說(shuō)到哪兒。

線程部分

1、多線程的實(shí)現(xiàn)方式有哪些?

這個(gè)題目在一面的時(shí)候基本上都會(huì)碰到吧,繼承 Thread 類、實(shí)現(xiàn)Runnable 接口,最后調(diào)用 的是 start() 方法來(lái)啟動(dòng)線程。

這里還有個(gè)知識(shí)點(diǎn)是 start() 跟 run() 方法的區(qū)別和聯(lián)系。

直接調(diào)用 start() 方法,此時(shí)線程處于一個(gè)就緒(可運(yùn)行)的狀態(tài),但是并沒(méi)有真正的運(yùn)行。而是得到CPU 的時(shí)間片后,開始執(zhí)行 run() 方法,run() 方法里面的是我們的線程體。

我們直接 運(yùn)行 run() 方法,它其實(shí)就是一個(gè)普通的方法調(diào)用,在主線程中執(zhí)行,是不會(huì)開啟多線程的。

2、描述一些線程死鎖的情況?

這個(gè)問(wèn)題在平常項(xiàng)目基本上沒(méi)怎么接觸到,但是我有過(guò)部分了解。回答的是: 兩個(gè)線程在持有自己的鎖的時(shí)候,還要去持有對(duì)方持有的鎖時(shí),由于別人的鎖已經(jīng)被對(duì)方持有,造成彼此等待對(duì)方釋放鎖的情況。回答得比較片面,還有一些類型的死鎖問(wèn)題沒(méi)有答出來(lái),后面直接交底了,面試官說(shuō)沒(méi)關(guān)系的。

建議大家在準(zhǔn)備這個(gè)問(wèn)題的時(shí)候能說(shuō)出來(lái)產(chǎn)生死鎖的條件、現(xiàn)象、解決辦法等。然后配上一些實(shí)例說(shuō)明,在面試過(guò)程中,面試官就提到說(shuō)根據(jù)我們平常遇到死鎖問(wèn)題的場(chǎng)景實(shí)例來(lái)說(shuō)。

大家可以搜一下下面這兩個(gè)死鎖場(chǎng)景問(wèn)題:

  1. 三個(gè)人 三根筷子:每個(gè)人需要拿到身邊的兩根筷子才能開始吃飯
  2. 銀行轉(zhuǎn)賬問(wèn)題:線程 A 從 X 賬戶向 Y 賬戶轉(zhuǎn)賬,線程 B 從賬戶 Y 向賬戶 X 轉(zhuǎn)賬,那么就會(huì)發(fā)生死鎖。

3、項(xiàng)目中有沒(méi)有用過(guò)線程池 ?怎么用的 ?

回答了我們項(xiàng)目里面有些接口需要組裝多個(gè)服務(wù)的數(shù)據(jù)進(jìn)行封裝,然后返回。這里面我們會(huì)使用多線程去并行拉取數(shù)據(jù),減少接口響應(yīng)時(shí)間。

面試官說(shuō):“ok,那么你有沒(méi)有看過(guò)線程池里面的源碼呢 ?有哪幾種線程池 ?”

源碼這里我遲疑了一下,我說(shuō)不太熟,然后我說(shuō)了幾種類型的線程池 newSingleThreadExecutor、newFixedThreadPool、newCachedThreadPool但是還漏了一種 newScheduledThreadPool 沒(méi)想起來(lái)。

4、線程池的原理是什么樣子?底層方法的參數(shù)分別是什么意思?

回答這個(gè)問(wèn)題的時(shí)候,當(dāng)時(shí)我卡住了。我知道這幾個(gè)底層都是對(duì) 調(diào)用的 ThreadPoolExecutor ,但是我死活沒(méi)有想起來(lái)名字,這時(shí)候面試官提醒了一下,然后說(shuō)沒(méi)關(guān)系的。

接著就問(wèn):“那你知道他的參數(shù)都有哪些嗎 ?都分別代表什么意思嗎 ?”

我回答的是 有個(gè) 線程的個(gè)數(shù) 和 線程存活的時(shí)間,其他的沒(méi)說(shuō)上來(lái)。然后面試官說(shuō):“沒(méi)關(guān)系的”。

補(bǔ)充一下:線程池底層都是通過(guò) ThreadPoolExecutor 來(lái)實(shí)現(xiàn)的。

記一次阿里巴巴一面經(jīng)歷,作為一名java程序員終于找到了自己差距

幾個(gè)參數(shù)的意思分別為:

  • corePoolSize: 線程池里最小線程數(shù)
  • maximumPoolSize:線程池里最大線程數(shù)量,超過(guò)最大線程時(shí)候會(huì)使用 RejectedExecutionHandler
  • keepAliveTime:線程最大的存活時(shí)間,超過(guò)這個(gè)時(shí)間就會(huì)被回收
  • unit:線程最大的存活時(shí)間的單位
  • workQueue:緩存需要執(zhí)行的異步任務(wù)的隊(duì)列
  • threadFactory:新建線程工廠
  • handler拒絕策略,表示當(dāng)workQueue已滿,且池中的線程數(shù)達(dá)到maximumPoolSize時(shí),線程池拒絕添加新任務(wù)時(shí)采取的策略。DiscardPolicy:拋棄當(dāng)前任務(wù),DiscardOldestPolicy:扔掉最舊的,CallerRunsPolicy:由向線程池提交任務(wù)的線程來(lái)執(zhí)行該任務(wù),AbortPolicy:拋出 RejectedExecutionException 異常。

問(wèn)到這里,我回答的確實(shí)太有限,面試官就沒(méi)有再細(xì)問(wèn)了,還是說(shuō):“沒(méi)關(guān)系的”。

如果你這里答出來(lái)了,那么我認(rèn)為你還需要掌握的是,這幾種線程池在哪些情況下使用什么類型的,以及要注意什么問(wèn)題,很大可能面試官會(huì)繼續(xù)深挖。

這里就不給出答案了,我相信你自己去搜一下,體會(huì)會(huì)更深刻些。

MyBatis 部分

記一次阿里巴巴一面經(jīng)歷,作為一名java程序員終于找到了自己差距

需要清晰系統(tǒng)圖的文末領(lǐng)取

5、mybatis 的 $ 與 # 的區(qū)別?

回答:他們兩都可以來(lái)傳遞參數(shù),不過(guò) # 可以方式 sql 注入,而 $ 就是字符串拼接的方式處理,可能會(huì)有sql 注入的問(wèn)題。

上面還有一個(gè)關(guān)鍵的點(diǎn)沒(méi)有答出來(lái),那就是 #{} 在預(yù)處理時(shí),會(huì)把參數(shù)部分用一個(gè)占位符 ? 代替 ,變成了如下的 sql 語(yǔ)句:

  1. select * from user where name = ?;
  2. 而 ${} 則只是簡(jiǎn)單的字符串拼接,在動(dòng)態(tài)解析階段就直接拼接成了 最終的sql 語(yǔ)句:select * from user where name = 'zhouq';

6、$ 跟 # 的使用場(chǎng)景 ?

這個(gè)問(wèn)題我沒(méi)有怎么理解得到,然后回答的就是 $ 在拼接表名的時(shí)候用,其他時(shí)候傳遞參數(shù)值的時(shí)候用 #。

7、mybatis 的 dao 接口跟 xml 文件里面的sql 是如何建立關(guān)系的?

這里問(wèn)到的時(shí)候比較蒙圈,然后回答的是:mybatis 會(huì)先解析這些xml 文件,xml 文件里面有命名空間 (namespace),這里可以跟dao 建立關(guān)系,然后 xml 中的每段 sql 會(huì)有一個(gè)id 跟 dao 中的接口進(jìn)行關(guān)聯(lián)。。。

然后面試官說(shuō): "如果 我有兩個(gè)這個(gè)xml 文件 都跟這個(gè)dao 建立關(guān)系了,那不是就是沖突了?",然后,我認(rèn)慫了。

我上面的回答太籠統(tǒng),肯定是有問(wèn)題的,建議你好好去了解一下mybatis 的原理。

mybatis 到這里就沒(méi)了。

數(shù)據(jù)庫(kù)

先問(wèn)的是,你平常使用得做多的是什么數(shù)據(jù)庫(kù),當(dāng)然了,mysql 。

8、mysql 鎖機(jī)制 ?

記一次阿里巴巴一面經(jīng)歷,作為一名java程序員終于找到了自己差距

需要清晰系統(tǒng)圖的文末領(lǐng)取

面試官問(wèn)的是,你了解mysql 的鎖機(jī)制么?我就只答出來(lái)一個(gè)行鎖。然后其他的沒(méi)想起,就認(rèn)了,其他的忘記了。

建議你去了解了解還有表鎖、頁(yè)面鎖 等等。

9、排它鎖 & 共享鎖你了解嗎 ?

這個(gè)地方我想了一會(huì),說(shuō)平時(shí)了解得不多。實(shí)時(shí)上,平常我們的小業(yè)務(wù)系統(tǒng)基本上沒(méi)有用到這些,可能有用到的地方,也沒(méi)有去在意吧。

接著,面試官說(shuō)了下面這個(gè)場(chǎng)景題,然后讓出解決方案。

10、場(chǎng)景問(wèn)題:在A線程處理一條數(shù)據(jù),比如扣款,或者是更新狀態(tài)時(shí)候,其他的線程比如 B 需要對(duì)它進(jìn)行阻塞,不能夠再對(duì)這條數(shù)據(jù)進(jìn)行操作,包括查詢也不行,得等A 線程處理完成以后,B才能進(jìn)行處理。A 跟 B 是同樣的業(yè)務(wù)代碼產(chǎn)生的,非不同的業(yè)務(wù)。要使用數(shù)據(jù)庫(kù)的鎖來(lái)實(shí)現(xiàn),怎么實(shí)現(xiàn) ?

問(wèn)這個(gè)問(wèn)題的時(shí)候,面試官很耐心的解釋了這個(gè)場(chǎng)景,然后問(wèn)我有沒(méi)有想起點(diǎn)什么來(lái)?其實(shí)就是想考察上面的關(guān)于數(shù)據(jù)庫(kù)鎖的問(wèn)題。

11、mysql 索引是怎么實(shí)現(xiàn)的?

回答的是 B+ 樹,接著面試官繼續(xù)問(wèn):“能否大致描述一下 B+ 樹的大致結(jié)構(gòu) ?”。這塊內(nèi)容沒(méi)怎么了解,直接認(rèn)慫了。

緩存相關(guān)

這塊內(nèi)容是我項(xiàng)目上寫得有使用了多級(jí)緩存的方案,然后面試官就這一塊問(wèn)了下面的這些關(guān)于使用緩存可能會(huì)遇到的問(wèn)題。

12、緩存擊穿、緩存穿透 、緩存雪崩 ?

13、熱點(diǎn)數(shù)據(jù)失效怎么解決?

這兩個(gè)問(wèn)題,以前好好了解過(guò),但是沒(méi)整理成自己的東西,面試的時(shí)候也說(shuō)得云里霧里。

14、先刪緩存還是先更新數(shù)據(jù)庫(kù),為什么?

這里我說(shuō)的:是先刪緩存,然后再更新數(shù)據(jù)庫(kù),但這是錯(cuò)誤的,這里有非常大的問(wèn)題。

想想這樣一個(gè)場(chǎng)景:

如果一個(gè)線程 A 先把緩存刪除了,然后去更新數(shù)據(jù)庫(kù),那么在它刪了緩存還沒(méi)有更新到數(shù)據(jù)庫(kù)的這個(gè)中間時(shí)間,線程B進(jìn)來(lái)了,發(fā)現(xiàn)緩存沒(méi)有,就去讀庫(kù),這時(shí)候還是讀取還是舊的數(shù)據(jù),然后又更新到緩存去了。此時(shí)A 才把新數(shù)據(jù)寫到數(shù)據(jù)庫(kù)。

此時(shí)就產(chǎn)生了一個(gè)典型的問(wèn)題就是“雙寫不一致”。

關(guān)于這塊問(wèn)題的討論:《緩存更新的套路》-陳皓老師

kafka

記一次阿里巴巴一面經(jīng)歷,作為一名java程序員終于找到了自己差距

需要清晰系統(tǒng)圖的文末領(lǐng)取

15、kafka 的架構(gòu),包含了哪些角色?

這個(gè)問(wèn)題我開始不知道怎么回答,就說(shuō)了個(gè) Broker,然后面試官提醒了一下:“不是我們平常還有生產(chǎn)者,消費(fèi)呀什么的嗎 ?”額,我說(shuō)還有生產(chǎn)者、消費(fèi)者、主題呀等等。

這過(guò)程中面試官還提到說(shuō)平常我們?cè)诖罱ǖ臅r(shí)候要配置寫什么東西呀等等,按照官網(wǎng)的介紹說(shuō)也行。

這里還有其他的比如Partition、消費(fèi)者組、還有一個(gè)主要的 就是 zk 了。

這里建議大家好好的把 kafka 里面的這些概念、屬于、架構(gòu)圖好好自己畫一下。不然真是關(guān)鍵時(shí)候真說(shuō)不出來(lái),但是他一提你又明白。這樣子肯定是不行的,面試是你說(shuō),不是面試官說(shuō)。

16、kafka 的最小工作單元?

這個(gè)問(wèn)題問(wèn)得也是蒙圈,其實(shí)就是說(shuō)我們?cè)趯懘a的時(shí)候,要用kafka的時(shí)候。我們需要使用那些最基礎(chǔ)的組件,比如生產(chǎn)者、消費(fèi)者、主題、偏移量 等等。

這個(gè)問(wèn)題如果你們遇到,最好向面試官問(wèn)清楚。

17、kafka 消息重復(fù)消費(fèi)的問(wèn)題??jī)绲仍趺醋龅模?/strong>

剛開始面試官說(shuō),你知道kafka 消息重復(fù)的問(wèn)題嗎?有沒(méi)遇到。

我回答的是,會(huì)存在消息重復(fù)消費(fèi)的問(wèn)題。我們?cè)谙M(fèi)數(shù)據(jù)這端做了冪等處理來(lái)解決。

然后面試官繼續(xù)才問(wèn)的是:冪等怎么來(lái)做的, 我說(shuō)通過(guò)設(shè)置數(shù)據(jù)版本號(hào),還有數(shù)據(jù)庫(kù)唯一索引等等。

面試官:“ok”。

這個(gè)問(wèn)題,如果你能告訴面試官產(chǎn)生重復(fù)消費(fèi)的情況,比如說(shuō)投遞的時(shí)候重復(fù)了,消費(fèi)的時(shí)候由于 offset 沒(méi)處理好等等問(wèn)題導(dǎo)致的話,我想可能會(huì)更好。

18、kafka ack 機(jī)制?集群中的ack 是怎么實(shí)現(xiàn)的?

這里我只回答上了 ack 機(jī)制是啥,但是實(shí)現(xiàn)原理沒(méi)有回答上來(lái)。

Redis

記一次阿里巴巴一面經(jīng)歷,作為一名java程序員終于找到了自己差距

需要清晰系統(tǒng)圖的文末領(lǐng)取

19、Redis 中有哪些數(shù)據(jù)結(jié)構(gòu)

平常使用得最多的是 String , 還有 List 、Hash、Set、ZSet 。

沒(méi)有再問(wèn)其他的內(nèi)容。

但是像Redis 為什么這么快這種問(wèn)題,我認(rèn)為你應(yīng)該要去了解,其他小伙伴經(jīng)常遇到。也就是多路復(fù)用是個(gè)什么玩意兒?

源碼

20、這里面試官問(wèn) 你平常有沒(méi)有看過(guò)一些源碼?框架的也行?JDK 的也行。

然后我說(shuō)看了 HashMap 的源碼,然后就巴拉巴拉的說(shuō)了一哈大體的 put、get 流程 ,它的結(jié)構(gòu)是什么樣子的。

這過(guò)程中還問(wèn)到了 怎么判斷兩個(gè)對(duì)象是否相等?也就是 == 和 equals 的知識(shí)點(diǎn)。

其他的就沒(méi)再繼續(xù)問(wèn)了。到這里整個(gè)電面過(guò)程結(jié)束了,說(shuō)10個(gè)工作日內(nèi)會(huì)給我答復(fù)此次面試情況。整個(gè)過(guò)程大概持續(xù)了40分鐘的樣子。

我知道,涼涼。

最后總結(jié)一下

上面的模塊雖然順序有變化,但是每個(gè)大塊里面的問(wèn)題都是按照順序來(lái)的,基本上都是由淺入深、循序漸進(jìn)的來(lái)問(wèn)。

像數(shù)據(jù)庫(kù)鎖、線程池、緩存問(wèn)題 這些內(nèi)容幾乎都是那種連環(huán)炮的形式,直到摸到你的底。

通過(guò)這次面試,親身體會(huì)到了差距。不過(guò),更有方向了。

告誡大家一點(diǎn)東西:

平常多積累輸出:輸出或者教會(huì)別人是最好的學(xué)習(xí)方式,光看不練,幾天就忘。

  • 先深后廣:深入學(xué)習(xí),而不是只停留在使用API 的層面,一塊一塊系統(tǒng)的深入了解,再去搞其他的。
  • 建立知識(shí)體系:把自己學(xué)習(xí)的內(nèi)容形成博客也好,什么導(dǎo)圖也罷,記得把這些零散的內(nèi)容,整理成自己的知識(shí)。
  • 別抱有僥幸心理:別裸面,如果自己有整理的還是多看一下,多準(zhǔn)備準(zhǔn)備。大廠的面試會(huì)挖到你最深的部分,不要覺(jué)得只背一些面試題就是 ok的,題是背不完的。臨時(shí)抱佛腳基本上過(guò)不了關(guān)。如果你是靠背面試題進(jìn)去的,那么你厲害,佩服。
  • 隔一段時(shí)間就去面試吧:不要學(xué)我,待一家公司三年多,中途都沒(méi)有出去面過(guò),出去面面才知道,哪些是需要去補(bǔ)充的。

有些問(wèn)題可能答案這些不是太全面,需要你自己去動(dòng)手。

希望這篇文章對(duì)你有幫助,哪怕只有一個(gè)點(diǎn),都是值得的。如果其中有一些點(diǎn)你不了解,那么你是時(shí)候要去補(bǔ)充了。

別在自己的舒適區(qū)待太久,不然出不來(lái)。出來(lái)混,遲早是要還的!

一直待在相對(duì)傳統(tǒng)一點(diǎn)的企業(yè),有四年半的 Java 開發(fā)經(jīng)驗(yàn),會(huì)點(diǎn)大數(shù)據(jù)的內(nèi)容,也跟客戶打過(guò)一年的交道,還帶過(guò) 10個(gè)月 10人+的技術(shù)團(tuán)隊(duì),有一定的協(xié)調(diào)組織能力,能夠理解 boss 的工作內(nèi)容,也能很好的配合別人做事。

資料領(lǐng)取

文件獲取方式:

關(guān)注我,加我的私人技術(shù)交流群免費(fèi)領(lǐng)??!【Java高級(jí)互聯(lián)網(wǎng)架構(gòu):964357187】點(diǎn)擊進(jìn)入

收集了還有你不知道的其它面試題(springboot、mybatis、并發(fā)、java中高級(jí)面試總結(jié)等)

需要一整套系統(tǒng)圖的也可以免費(fèi)領(lǐng)取,我這邊也有整理自己的一套架構(gòu)體系、阿里京東騰訊必問(wèn)面試題、架構(gòu)知識(shí)點(diǎn)視頻講解.......需要的朋友記得加我的私人交流群【Java高級(jí)互聯(lián)網(wǎng)架構(gòu):964357187】點(diǎn)擊進(jìn)入

記一次阿里巴巴一面經(jīng)歷,作為一名java程序員終于找到了自己差距

記一次阿里巴巴一面經(jīng)歷,作為一名java程序員終于找到了自己差距
記一次阿里巴巴一面經(jīng)歷,作為一名java程序員終于找到了自己差距
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 上周在拉勾上收到一個(gè)螞蟻金服的大哥要我的簡(jiǎn)歷,當(dāng)時(shí)很驚訝,居然有螞蟻金服的找到我,然后想都沒(méi)想就給了。 受寵若驚呀...
    靜曉安來(lái)閱讀 667評(píng)論 0 0
  • Swift1> Swift和OC的區(qū)別1.1> Swift沒(méi)有地址/指針的概念1.2> 泛型1.3> 類型嚴(yán)謹(jǐn) 對(duì)...
    cosWriter閱讀 11,680評(píng)論 1 32
  • 本文作者在一年之內(nèi)參加過(guò)多場(chǎng)面試,應(yīng)聘崗位均為 Java 開發(fā)方向。在不斷的面試中,分類總結(jié)了 Java 開發(fā)崗位...
    TheOne_6e96閱讀 984評(píng)論 0 9
  • 之前項(xiàng)目中用到tableview的多選操作,今天梳理總結(jié)一下 要實(shí)現(xiàn)tableview的多選操作有很多種方式.有系...
    小心韓國(guó)人閱讀 2,867評(píng)論 0 4
  • 6:15 醒來(lái),昨日時(shí)間記錄補(bǔ)充 6:30 起床,燒水,洗漱,收拾 6:56 出門,摩拜單車 7:11 到達(dá)班車點(diǎn)...
    Min_Xu閱讀 270評(píng)論 0 0

友情鏈接更多精彩內(nèi)容