1. 程式人生 > >記一次阿里巴巴一面經歷,作為一名java程式設計師終於找到了自己差距!

記一次阿里巴巴一面經歷,作為一名java程式設計師終於找到了自己差距!

面試前的故事

上週在拉勾上收到一個螞蟻金服的大哥要我的簡歷,當時很驚訝,居然有螞蟻金服的找到我,然後想都沒想就給了。

受寵若驚呀,我知道自己的水平跟阿里的差距有多遠,以前一直沒用勇氣去投,連試試都不敢。這次居然主動找過來了,當時就再想,難道阿里這麼缺人麼?還是隻是為了完成某些KPI,當然了,我這種想法比較幼稚。

沒想到的是第二天居然收到了阿里巴巴的面試邀請郵件,裡面說到會在10個工作日內進行第一次面試。

不管怎麼樣吧,既然面試來了,就試試吧。能面一次這種級別的技術公司,看看自己真實的差距,也是三生有幸了。從離職的這段時間也補了補JVM,基礎的資料結構演算法什麼的,還有一些高頻的Java 基礎問題。

週一晚上 8:25 接到了螞蟻大哥來的電話,果然,跟傳說中的一樣,還在上班。當時很意外,沒想到是電話面試,因為郵件中沒提到,後面回想,貌似一面基本上都是電話面試,有些朋友二面也是電面。

進入正題,下面是整個內容。順序有些不一致,我按照模組來整理的。

記一次阿里巴巴一面經歷,作為一名java程式設計師終於找到了自己差距

自我介紹

自我介紹就先介紹 多大了、畢業多久了、做了什麼些東西、最近做的什麼內容,擅長的部分呀 等等。

這裡說一下,自我介紹的內容如實說就好,不要太過於誇大,自我介紹的內容建議大家提前準備好,不要說的時候想到哪兒說到哪兒。

執行緒部分

1、多執行緒的實現方式有哪些?

這個題目在一面的時候基本上都會碰到吧,繼承 Thread 類、實現Runnable 介面,最後呼叫 的是 start() 方法來啟動執行緒。

這裡還有個知識點是 start() 跟 run() 方法的區別和聯絡。

直接呼叫 start() 方法,此時執行緒處於一個就緒(可執行)的狀態,但是並沒有真正的執行。而是得到CPU 的時間片後,開始執行 run() 方法,run() 方法裡面的是我們的執行緒體。

我們直接 執行 run() 方法,它其實就是一個普通的方法呼叫,在主執行緒中執行,是不會開啟多執行緒的。

2、描述一些執行緒死鎖的情況?

這個問題在平常專案基本上沒怎麼接觸到,但是我有過部分了解。回答的是: 兩個執行緒在持有自己的鎖的時候,還要去持有對方持有的鎖時,由於別人的鎖已經被對方持有,造成彼此等待對方釋放鎖的情況。回答得比較片面,還有一些型別的死鎖問題沒有答出來,後面直接交底了,面試官說沒關係的。

建議大家在準備這個問題的時候能說出來產生死鎖的條件、現象、解決辦法等。然後配上一些例項說明,在面試過程中,面試官就提到說根據我們平常遇到死鎖問題的場景例項來說。

大家可以搜一下下面這兩個死鎖場景問題:

  1. 三個人 三根筷子:每個人需要拿到身邊的兩根筷子才能開始吃飯
  2. 銀行轉賬問題:執行緒 A 從 X 賬戶向 Y 賬戶轉賬,執行緒 B 從賬戶 Y 向賬戶 X 轉賬,那麼就會發生死鎖。

3、專案中有沒有用過執行緒池 ?怎麼用的 ?

回答了我們專案裡面有些介面需要組裝多個服務的資料進行封裝,然後返回。這裡面我們會使用多執行緒去並行拉取資料,減少介面響應時間。

面試官說:“ok,那麼你有沒有看過執行緒池裡面的原始碼呢 ?有哪幾種執行緒池 ?”

原始碼這裡我遲疑了一下,我說不太熟,然後我說了幾種型別的執行緒池 newSingleThreadExecutor、newFixedThreadPool、newCachedThreadPool但是還漏了一種 newScheduledThreadPool 沒想起來。

4、執行緒池的原理是什麼樣子?底層方法的引數分別是什麼意思?

回答這個問題的時候,當時我卡住了。我知道這幾個底層都是對 呼叫的 ThreadPoolExecutor ,但是我死活沒有想起來名字,這時候面試官提醒了一下,然後說沒關係的。

接著就問:“那你知道他的引數都有哪些嗎 ?都分別代表什麼意思嗎 ?”

我回答的是 有個 執行緒的個數 和 執行緒存活的時間,其他的沒說上來。然後面試官說:“沒關係的”。

補充一下:執行緒池底層都是通過 ThreadPoolExecutor 來實現的。

記一次阿里巴巴一面經歷,作為一名java程式設計師終於找到了自己差距

幾個引數的意思分別為:

  • corePoolSize: 執行緒池裡最小執行緒數
  • maximumPoolSize:執行緒池裡最大執行緒數量,超過最大執行緒時候會使用 RejectedExecutionHandler
  • keepAliveTime:執行緒最大的存活時間,超過這個時間就會被回收
  • unit:執行緒最大的存活時間的單位
  • workQueue:快取需要執行的非同步任務的佇列
  • threadFactory:新建執行緒工廠
  • handler拒絕策略,表示當workQueue已滿,且池中的執行緒數達到maximumPoolSize時,執行緒池拒絕新增新任務時採取的策略。DiscardPolicy:拋棄當前任務,DiscardOldestPolicy:扔掉最舊的,CallerRunsPolicy:由向執行緒池提交任務的執行緒來執行該任務,AbortPolicy:丟擲 RejectedExecutionException 異常。

問到這裡,我回答的確實太有限,面試官就沒有再細問了,還是說:“沒關係的”。

如果你這裡答出來了,那麼我認為你還需要掌握的是,這幾種執行緒池在哪些情況下使用什麼型別的,以及要注意什麼問題,很大可能面試官會繼續深挖。

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

MyBatis 部分

需要清晰系統圖的文末領取

5、mybatis 的 $ 與 # 的區別?

回答:他們兩都可以來傳遞引數,不過 # 可以方式 sql 注入,而 $ 就是字串拼接的方式處理,可能會有sql 注入的問題。

上面還有一個關鍵的點沒有答出來,那就是 #{} 在預處理時,會把引數部分用一個佔位符 ? 代替 ,變成了如下的 sql 語句:

  1. select * from user where name = ?;
  2. 而 ${} 則只是簡單的字串拼接,在動態解析階段就直接拼接成了 最終的sql 語句:select * from user where name = 'zhouq';

6、$ 跟 # 的使用場景 ?

這個問題我沒有怎麼理解得到,然後回答的就是 $ 在拼接表名的時候用,其他時候傳遞引數值的時候用 #。

7、mybatis 的 dao 介面跟 xml 檔案裡面的sql 是如何建立關係的?

這裡問到的時候比較蒙圈,然後回答的是:mybatis 會先解析這些xml 檔案,xml 檔案裡面有名稱空間 (namespace),這裡可以跟dao 建立關係,然後 xml 中的每段 sql 會有一個id 跟 dao 中的介面進行關聯。。。

然後面試官說: "如果 我有兩個這個xml 檔案 都跟這個dao 建立關係了,那不是就是衝突了?",然後,我認慫了。

我上面的回答太籠統,肯定是有問題的,建議你好好去了解一下mybatis 的原理。

mybatis 到這裡就沒了。

資料庫

先問的是,你平常使用得做多的是什麼資料庫,當然了,mysql 。

8、mysql 鎖機制 ?

需要清晰系統圖的文末領取

面試官問的是,你瞭解mysql 的鎖機制麼?我就只答出來一個行鎖。然後其他的沒想起,就認了,其他的忘記了。

建議你去了解了解還有表鎖、頁面鎖 等等。

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

這個地方我想了一會,說平時瞭解得不多。實時上,平常我們的小業務系統基本上沒有用到這些,可能有用到的地方,也沒有去在意吧。

接著,面試官說了下面這個場景題,然後讓出解決方案。

10、場景問題:在A執行緒處理一條資料,比如扣款,或者是更新狀態時候,其他的執行緒比如 B 需要對它進行阻塞,不能夠再對這條資料進行操作,包括查詢也不行,得等A 執行緒處理完成以後,B才能進行處理。A 跟 B 是同樣的業務程式碼產生的,非不同的業務。要使用資料庫的鎖來實現,怎麼實現 ?

問這個問題的時候,面試官很耐心的解釋了這個場景,然後問我有沒有想起點什麼來?其實就是想考察上面的關於資料庫鎖的問題。

11、mysql 索引是怎麼實現的?

回答的是 B+ 樹,接著面試官繼續問:“能否大致描述一下 B+ 樹的大致結構 ?”。這塊內容沒怎麼了解,直接認慫了。

快取相關

這塊內容是我專案上寫得有使用了多級快取的方案,然後面試官就這一塊問了下面的這些關於使用快取可能會遇到的問題。

12、快取擊穿、快取穿透 、快取雪崩 ?

13、熱點資料失效怎麼解決?

這兩個問題,以前好好了解過,但是沒整理成自己的東西,面試的時候也說得雲裡霧裡。

14、先刪快取還是先更新資料庫,為什麼?

這裡我說的:是先刪快取,然後再更新資料庫,但這是錯誤的,這裡有非常大的問題。

想想這樣一個場景:

如果一個執行緒 A 先把快取刪除了,然後去更新資料庫,那麼在它刪了快取還沒有更新到資料庫的這個中間時間,執行緒B進來了,發現快取沒有,就去讀庫,這時候還是讀取還是舊的資料,然後又更新到快取去了。此時A 才把新資料寫到資料庫。

此時就產生了一個典型的問題就是“雙寫不一致”。

關於這塊問題的討論:《快取更新的套路》-陳皓老師

kafka

需要清晰系統圖的文末領取

15、kafka 的架構,包含了哪些角色?

這個問題我開始不知道怎麼回答,就說了個 Broker,然後面試官提醒了一下:“不是我們平常還有生產者,消費呀什麼的嗎 ?”額,我說還有生產者、消費者、主題呀等等。

這過程中面試官還提到說平常我們在搭建的時候要配置寫什麼東西呀等等,按照官網的介紹說也行。

這裡還有其他的比如Partition、消費者組、還有一個主要的 就是 zk 了。

這裡建議大家好好的把 kafka 裡面的這些概念、屬於、架構圖好好自己畫一下。不然真是關鍵時候真說不出來,但是他一提你又明白。這樣子肯定是不行的,面試是你說,不是面試官說。

16、kafka 的最小工作單元?

這個問題問得也是蒙圈,其實就是說我們在寫程式碼的時候,要用kafka的時候。我們需要使用那些最基礎的元件,比如生產者、消費者、主題、偏移量 等等。

這個問題如果你們遇到,最好向面試官問清楚。

17、kafka 訊息重複消費的問題?冪等怎麼做的?

剛開始面試官說,你知道kafka 訊息重複的問題嗎?有沒遇到。

我回答的是,會存在訊息重複消費的問題。我們在消費資料這端做了冪等處理來解決。

然後面試官繼續才問的是:冪等怎麼來做的, 我說通過設定資料版本號,還有資料庫唯一索引等等。

面試官:“ok”。

這個問題,如果你能告訴面試官產生重複消費的情況,比如說投遞的時候重複了,消費的時候由於 offset 沒處理好等等問題導致的話,我想可能會更好。

18、kafka ack 機制?叢集中的ack 是怎麼實現的?

這裡我只回答上了 ack 機制是啥,但是實現原理沒有回答上來。

Redis

19、Redis 中有哪些資料結構

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

沒有再問其他的內容。

但是像Redis 為什麼這麼快這種問題,我認為你應該要去了解,其他小夥伴經常遇到。也就是多路複用是個什麼玩意兒?

原始碼

20、這裡面試官問 你平常有沒有看過一些原始碼?框架的也行?JDK 的也行。

然後我說看了 HashMap 的原始碼,然後就巴拉巴拉的說了一哈大體的 put、get 流程 ,它的結構是什麼樣子的。

這過程中還問到了 怎麼判斷兩個物件是否相等?也就是 == 和 equals 的知識點。

其他的就沒再繼續問了。到這裡整個電面過程結束了,說10個工作日內會給我答覆此次面試情況。整個過程大概持續了40分鐘的樣子。

我知道,涼涼。

最後總結一下

上面的模組雖然順序有變化,但是每個大塊裡面的問題都是按照順序來的,基本上都是由淺入深、循序漸進的來問。

像資料庫鎖、執行緒池、快取問題 這些內容幾乎都是那種連環炮的形式,直到摸到你的底。

通過這次面試,親身體會到了差距。不過,更有方向了。

告誡大家一點東西:

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

  • 先深後廣:深入學習,而不是隻停留在使用API 的層面,一塊一塊系統的深入瞭解,再去搞其他的。
  • 建立知識體系:把自己學習的內容形成部落格也好,什麼導圖也罷,記得把這些零散的內容,整理成自己的知識。
  • 別抱有僥倖心理:別裸面,如果自己有整理的還是多看一下,多準備準備。大廠的面試會挖到你最深的部分,不要覺得只背一些面試題就是 ok的,題是背不完的。臨時抱佛腳基本上過不了關。如果你是靠背面試題進去的,那麼你厲害,佩服。
  • 隔一段時間就去面試吧:不要學我,待一家公司三年多,中途都沒有出去面過,出去面面才知道,哪些是需要去補充的。

有些問題可能答案這些不是太全面,需要你自己去動手。

希望這篇文章對你有幫助,哪怕只有一個點,都是值得的。如果其中有一些點你不瞭解,那麼你是時候要去補充了。

別在自己的舒適區待太久,不然出不來。出來混,遲早是要還的!

一直待在相對傳統一點的企業,有四年半的 Java 開發經驗,會點大資料的內容,也跟客戶打過一年的交道,還帶過 10個月 10人+的技術團隊,有一定的協調組織能力,能夠理解 boss 的工作內容,也能很好的配合別人做事。

資料領取

檔案獲取方式:

關注我,加我的私人技術交流群免費領取!【Java高階網際網路架構:964357187】點選進入

收集了還有你不知道的其它面試題(springboot、mybatis、併發、java中高階面試總結等)

需要一整套系統圖的也可以免費領取,我這邊也有整理自己的一套架構體系、阿里京東騰訊必問面試題、架構知識點視訊講解.......需要的朋友記得加我的私人交流群【Java高階網際網路架構:964357187】點選進入

相關推薦

阿里巴巴一面經歷作為java程式設計師終於找到自己差距

面試前的故事 上週在拉勾上收到一個螞蟻金服的大哥要我的簡歷,當時很驚訝,居然有螞蟻金服的找到我,然後想都沒想就給了。 受

Java程式設計師而言 如何提高自己英語水平

  對一名Java程式設計師而言,如何提高自己英語水平?對Java程式設計師來說,英語儼然成為自己必備語言。因為計算機起源和發展都源於英語世界,準確和權威的資料都是英文原版。翻譯帶來的誤解和差異很多時候會成為我們學習的困擾。   不僅僅是閱讀障礙需要提升自己的英語水平,在自己編寫程式碼的時候英語

雲伺服器購買經歷給個人建站的小白做些參考

阿里雲產品優惠購,代金券限時領,單筆訂單現金實付滿100元減30元,另有50元、150元、300元面額,網站緩慢?伺服器不穩定?從此再也不用擔心這些問題;如果早就想買阿里雲伺服器,現在是最佳時機,點選購買 背景為什麼要去買伺服器?每天瀏覽部落格園,瞻仰各

替換多個詞批量替換多個字串(使用不的解決辦法)

三天前上CSDN,發現有人回覆批量替換多個詞的工具使用不了。下載下來試用了一下,確實報錯,這兩天打算做個網頁版本的,排版佈局還沒弄好。 上貼回覆以前工具使用不了的解決辦法:下載32位的jre,然後配置JAVA_HOME。 2、下載完畢解壓後,假如路徑(自

分享java程式設計師是如何走向巔峰成為阿里的P8高階架構師

具有一到五年開發經驗的程式設計師 需要學習內容很多 JVM/分散式/高併發/效能優化/Spring MVC/Spring Boot/Spring Cloud/MyBatis/Netty原始碼分析等等等 01、透徹理解Tomcat原理手寫動靜態資源的實現 02、分享能源領域的分散式監測系統

入編碼深似海在達觀資料做程式設計師是怎樣種體驗?

在技術浪潮一波接一波推動人類社會前進的歷史程序當中,程式設計師始終是站在浪尖的群體。2014年起,把每年10月24日(2^10)定義為程式設計師節。這可能是唯一一個與數字緊密相關的節日——也體現了這個節日的含義:數字、程式碼、簡單。 作為一家程式設計師佔比60%以上的技術驅動公

java程式設計師是如何走向巔峰成為阿里的P8高階架構師

具有一到五年開發經驗的程式設計師 需要學習內容很多 JVM/分散式/高併發/效能優化/Spring MVC/Spring Boot/Spring Cloud/MyBatis/Netty原始碼分析等等等 01、透徹理解Tomcat原理手寫動靜態資源的實現 02、分享能源領域的分散式監測系統架構

作為Java程式設計師我不接私活也能月薪38k

開發十年,就只剩下這套架構體系了! >>>   

準備兩個月的阿里面經寫給初中級Java程式設計師 的BAT 面試寶典

1. 簡介 筆者普通院校畢業,沒有光鮮亮麗的職業背景,憑著自己的激情和兩個月的準備最終拿到京東和阿里巴巴 Offer。下面就是作

看完《網際網路公司時尚穿搭指南》百度程式設計師笑出豬聲太逗

今天,朋友圈裡被一篇名叫《網際網路公司時尚穿搭指南》的文章刷屏了。 早上上班的時候,就在電梯裡遇到一群程式設計師議論紛紛。 程式設計師A:昨天那篇推文挺火啊,黑程式設計師格子衫的。 程式設計師B:(興奮臉)好久沒黑了~ 程式設計師C:我看看我今天穿的是不是格子

公司強制要求所有程式設計師統一電腦桌面網友:做個程式設計師太難

在職場上經常會遇到一些奇葩的規定,相信不少人都遇到過,因為在公司打工,所以面對這些奇葩規定也是很無奈,只能選擇妥協,那麼大家都遇到過哪些奇葩的規定呢?最近就在職場論壇看到一個公司的奇葩規定。 一家公司要求所有的程式設計師都統一電腦桌面,這位程式設計師朋友直接表示程式設計師連自己的桌面桌布都不能擁

想進阿里、京東、美團面試的java程式設計師看過來

第一個問題:阿里面試問些什麼 參加阿里的社招面試,而社招不同於校招,問題的範圍其實是很隨機的。因為能參加一些比較知名的網際網路公司社招的人,70%以上都會有個3-5年的經驗。這倒不是說一兩年經驗的同學沒有機會進這些公司,而是因為這種公司,大部分情況下只招一些比

怎樣快速成為java程式設計師

        如果你想成為一名Java程式設計師,那麼今天你算是來對了,小編來給你們送福利了!!!教你怎樣快速成為一名Java程式設計師。下面給出以下幾個建議,快來學習吧。 一、Java基礎         首先去找一個Java的基礎教程學一下,這裡可以推薦一套看著還靠譜

作為Java程式設計師一定要不斷關注學習最前沿的技術

        無論做什麼事情都不可能做到一蹴而就,很多事情都是水滴石穿。那麼作為一名Java程式設計師當然也要保持不斷學習的狀態才能在這個領域站穩腳跟。那些工作了一定年限的技術人總有一天會感覺到自己遇到了職業瓶頸,這個時候如果你還是安於現狀不去學習鑽研的話只會被長江後浪推前

成為JAVA程式設計師的必備知識你都懂嗎?

每逢長假都會有很多程式設計師跳槽,十一、過年是跳槽黃金時刻,尤其是過年。過年的時候年終獎到手,沒有了多少牽掛,年終同學同事聚會比較多,溝通的就多,各種工作機會的訊息也相應會多,所以跳槽的機會也就會多。跳槽就必不可少的要經過面試,那麼作為一個Java程式設計師需要準備哪些面試

前後端分離時代Java 程式設計師的變與不變

事情的起因是這樣的,有個星球的小夥伴向邀請鬆哥在知乎上回答一個問題,原題是: 前後端分離的時代,Java後臺程式設計師的技術建議? 鬆哥認真看了下這個問題,感覺對於初次接觸前後端分離的小夥伴來說,可能都會存在這樣的疑問,於是決定通過這篇文章和大家聊一聊這個話題。 我這裡還是儘量從一個 Java 程式設計

去擺攤吧落魄的Java程式設計師

真的,我也打算去擺攤,宣傳語我都想好了。沉默王二,一枚有顏值卻靠才華苟且的程式設計師,《Web 全棧開發進階之路》作者,CSDN 明星博主,周排名第 4,總排名 40,這資料在眾多網際網路大咖面前不值一提,但在洛陽,我想還是有一席之地的。 況且我家裡有很多書,每天晚上帶上二三十本書,到河科大學校門口擺個攤,前

BATJTMD大廠招聘都招什麼樣Java程式設計師

![](https://img-blog.csdnimg.cn/20201115203216867.png) 作者:小傅哥 部落格:[https://bugstack.cn](https://bugstack.cn) > 沉澱、分享、成長,讓自己和他人都能有所收穫!

學習hadoop遇到的問題(阿里雲伺服器被惡意掛木馬CPU100%)

在我剛開始學習時,把防火牆,安全組都開放了,過了一段時間被掛上了木馬。並且殺死程序一會還啟動 解決辦法 1通過命令netstat -antlp|grep 9002檢視埠檔案地址,刪除可以檔案(java資料夾) 2.還得在安全組中關閉hadoop一些對外開放的web頁面(可以改變埠號)

【年前最後波裝逼】阿里面試我是如何用一行程式碼解決約瑟夫環問題的

約瑟夫環問題算是很經典的題了,估計大家都聽說過,然後我就在一次筆試中遇到了,下面我就用 3 種方法來詳細講解一下這道題,最後一種方法學了之後保證讓你可以讓你裝逼。 問題描述:編號為 1-N 的 N 個士兵圍坐在一起形成一個圓圈,從編號為 1 的士兵開始依次報數(1,2,3...這樣依次報),數到 m 的 士