最近原來(lái)實(shí)習(xí)時(shí)候的Boss聯(lián)系我,說(shuō)他跳槽到了阿里,問(wèn)我有沒(méi)有興趣面一個(gè)Java后臺(tái)開發(fā)崗位。考慮到我只工作了一年,現(xiàn)在去阿里肯定要降薪,因此也沒(méi)有太強(qiáng)烈的意愿。但出于提升自我的角度考慮,參加了面試。
一面(電話面試一小時(shí))
首先做一個(gè)簡(jiǎn)單的自我介紹,主要包括學(xué)校經(jīng)歷和工作經(jīng)歷。我工作經(jīng)歷只有一年,大部分時(shí)間都是在做產(chǎn)品設(shè)計(jì)和UI/UX Design,因此隔著電話都能感受到面試官的shock。
Java基礎(chǔ)。自動(dòng)拆裝箱如何實(shí)現(xiàn),String,StringBuffer,StringBuilder的異同以及各自的實(shí)現(xiàn)。
JVM基礎(chǔ)。JVM的內(nèi)存模型,常見的垃圾回收算法。
參考我的文集:《深入理解Java虛擬機(jī)》
- 事務(wù)ACID,編程時(shí)如何保證事務(wù),分布式情況下如何保證事務(wù)。
由于分布式相關(guān)場(chǎng)景我沒(méi)有接觸過(guò),因此面試官一直誘導(dǎo)我去設(shè)計(jì)實(shí)現(xiàn)一個(gè)分布式事務(wù)。
數(shù)據(jù)庫(kù)樂(lè)觀鎖和悲觀鎖。如何實(shí)現(xiàn)一個(gè)樂(lè)觀鎖。
消息隊(duì)列使用場(chǎng)景,Kafka的架構(gòu)以及原理。
什么是restful api,和rpc調(diào)用有什么區(qū)別。
單例的幾種寫法。volatile關(guān)鍵字有什么作用。
以上就是電話面試的大體問(wèn)題,面試完之后,又發(fā)給我三道算法題目,要求我一小時(shí)內(nèi)完成,下面是三道算法題:
- 翻轉(zhuǎn)一個(gè)long類型數(shù)字。例如輸入123456L,輸出654321L。
public long reverse(long i){
}
Leetcode翻轉(zhuǎn)integer的變種。考察能否正確處理溢出的情況。
- 輸入一個(gè)double,要求返回與它最接近的.49或.99的數(shù)字。例如12.77返回12.99,11.02返回10.99,12.61返回12.49。
這道題目應(yīng)該沒(méi)有什么坑,邏輯清晰即可。
- 有三個(gè)線程ABC分別向一個(gè)數(shù)組中寫入a,l,i,要求最終的寫入結(jié)果形如alialiali...寫入次數(shù)由A線程決定。
考察線程等待喚醒。具體參考我的這篇文章:多線程順序打印問(wèn)題
這三道題目做的還比較順利,第二天面試官又聯(lián)系我闡述一下第一題和第三題的思路,然后通知我可以參加下一輪了。
二面(電話面試一小時(shí))
二面主要考察了一些開放式的問(wèn)題。
首先還是自我介紹。主要是工作后的經(jīng)歷。介紹一下工作一年所在team的產(chǎn)品,我承擔(dān)了什么職責(zé)。
開放式問(wèn)題。如何設(shè)計(jì)一個(gè)rpc框架。
開放式問(wèn)題。如何設(shè)計(jì)一個(gè)服務(wù)注冊(cè)中心。
集合類源碼。HashMap是如何實(shí)現(xiàn)的,擴(kuò)容的過(guò)程,為什么要擴(kuò)容為2倍。HashMap中的鏈表替換為數(shù)組可以嗎?時(shí)間復(fù)雜度相同嗎?一致性哈希算法
集合類源碼。線程安全的HashMap是什么?(HashTable和ConcurrentHashMap)ConcurrentHashMap是如何實(shí)現(xiàn)的?(Java7分段鎖和Java8的CAS+Lock)和HashTable相比有什么優(yōu)勢(shì)?
紅黑樹的結(jié)構(gòu),時(shí)間復(fù)雜度是多少,如何計(jì)算的
什么是CAS操作,如何實(shí)現(xiàn)一個(gè)自定義鎖
- 數(shù)據(jù)庫(kù)設(shè)計(jì)。有一張很大的order表,如何設(shè)計(jì)能夠提升查詢效率(同時(shí)滿足根據(jù)買家id和賣家id查詢)?
二面也同樣是一小時(shí)左右,面試過(guò)程還算順利。只是當(dāng)時(shí)我在廈門鼓浪嶼的一家小餐館吃晚飯,周圍的嘈雜和悶熱使我很煩躁,感覺(jué)面試官態(tài)度有些傲慢。。。ps.一面二面結(jié)束后面試官都各種暗示我要瘋狂加班能不能接受blabla。。。
三面(電話面試一個(gè)半小時(shí))
二面結(jié)束后的第三天,就收到了現(xiàn)場(chǎng)三面的通知。然而我還在廈門旅行,因此改為了電話面試。
三面是一個(gè)大Boss,因此面試的問(wèn)題都更考察一些分析問(wèn)題的能力。
介紹一下你工作一年學(xué)習(xí)到什么?所在項(xiàng)目的架構(gòu)是什么樣的?UI/UX設(shè)計(jì)有哪些規(guī)范(由于我說(shuō)我學(xué)到了一些UI/UX設(shè)計(jì)方法,因此面試官就問(wèn)了)?
數(shù)據(jù)隔離級(jí)別,臟讀幻讀。
具體參考我的這篇文章:數(shù)據(jù)庫(kù)復(fù)習(xí)
- 線程池原理。
具體參考我的這篇文章:Chapter 9 Java中的線程池
- Synchronized的實(shí)現(xiàn),鎖的升級(jí)過(guò)程。
具體參考我的這篇文章:Chapter 2 Java并發(fā)機(jī)制的底層實(shí)現(xiàn)原理
- K8s的作用,K8s的底層架構(gòu)。
具體參考我的K8s文集:Kubernetes從入門到實(shí)踐
對(duì)我業(yè)余時(shí)間做的一些項(xiàng)目做了介紹。
你覺(jué)得加入阿里你能給阿里帶來(lái)什么?
進(jìn)入阿里你需要忍受很多困難,需要迎難而上,如果績(jī)效考評(píng)拿到差評(píng),你會(huì)怎么辦?
三面總的來(lái)說(shuō)也還算順利,面試官也算和藹。
總結(jié)
整個(gè)流程從一面到三面結(jié)束大約持續(xù)了10天左右??偟膩?lái)說(shuō),問(wèn)題都是預(yù)期范圍內(nèi)的,雖然面試過(guò)程中問(wèn)到了一些分布式相關(guān)問(wèn)題,我都沒(méi)有任何經(jīng)驗(yàn),這時(shí)候不要放棄,主動(dòng)說(shuō)出你的思路,然后在面試官的誘導(dǎo)下,相信你能說(shuō)出屬于的答案。
最后,是我總結(jié)的一些面試Java后臺(tái)工程師必須要掌握的知識(shí)點(diǎn)。相信這些知識(shí)點(diǎn)都掌握了,就是一名入門的Java工程師了!
1. 集合類源碼
- ArrayList:內(nèi)部數(shù)據(jù)結(jié)構(gòu),數(shù)組擴(kuò)容機(jī)制
- LinkedList:內(nèi)部數(shù)據(jù)結(jié)構(gòu),為什么使用雙向鏈表
- HashMap:內(nèi)部數(shù)據(jù)結(jié)構(gòu),put方法的完整流程,擴(kuò)容機(jī)制
- LikedHashMap:內(nèi)部數(shù)據(jù)結(jié)構(gòu),如何實(shí)現(xiàn)一個(gè)Cache
- TreeMap:內(nèi)部數(shù)據(jù)結(jié)構(gòu),時(shí)間復(fù)雜度
- CurrentHashMap:內(nèi)部數(shù)據(jù)結(jié)構(gòu),Java7分段鎖,Java8 CAS+Synchronized
2. Java基礎(chǔ)
- 自動(dòng)拆裝箱原理
- String,StringBuffer和StringBuilder
- Throwable
- reader和stream
- NIO(參考我的文集:《Java NIO學(xué)習(xí)筆記》)
3. JVM基礎(chǔ)(參考我的文集:《深入理解Java虛擬機(jī)》)
- JVM內(nèi)存模型(參考我的文章:Chapter 2 Java內(nèi)存區(qū)域與內(nèi)存溢出異常)
- 常見垃圾回收算法(參考我的文集:Chapter 3 垃圾收集器與內(nèi)存分配)
4. 并發(fā)編程基礎(chǔ)(參考我的文集:《Java 并發(fā)編程的藝術(shù)》和《Java Concurrency in Practice》)
- Synchronized關(guān)鍵字原理(參考我的文章:Chapter 2 Java并發(fā)機(jī)制的底層實(shí)現(xiàn)原理)
- wait,notify,sleep(參考我的文章:Java object wait,notify)
- 安全的終止線程以及線程的狀態(tài)轉(zhuǎn)換(參考我的文章:Chapter 4 線程基礎(chǔ))
- 自定義Lock(參考我的文章:Chapter 5 Java中的鎖(一)和Chapter 5 Java中的鎖(二))
- 線程池原理(參考我的文章:Chapter 9 Java中的線程池和Chapter 10 Executor框架)
5. 數(shù)據(jù)庫(kù)基礎(chǔ)
- 數(shù)據(jù)庫(kù)三范式,事務(wù)ACID,隔離級(jí)別,視圖,索引(41參考我的文章:數(shù)據(jù)庫(kù)復(fù)習(xí))
- JPA實(shí)體狀態(tài)(參考我的文章:JPA實(shí)體的四種狀態(tài))
- EntityManger(參考我的文章:JPA EntityManager詳解)
6. 網(wǎng)絡(luò)基礎(chǔ)
- TCP/IP(參考我的文章:網(wǎng)絡(luò)復(fù)習(xí))
7. 常見設(shè)計(jì)模式
- 裝飾者,模板方法,策略,工廠,狀態(tài)