歡迎關注專欄:后端架構技術精選。里面有大量關于的Java高級架構知識點分享,還有各種面試趣聞以及程序員身邊事,如有好文章也歡迎投稿哦。
快手高開及以上職級面試 是沒有筆試或者機試的,所以從第一輪開始就是直接面對面試官。
一輪
主要考察對Java基礎的理解和深入程度。
Spring 原理,Spring IOC、AOP。
這個問題 最好可以多說一點,比如 對于IOC,不妨把Bean 如何加載、如何初始化以及如何注冊到IOC容?中的詳細過程說一下, 涉及BeanDefinition、BeanFactory也深入細節聊一下。一個請求過來在Spring中發生了哪些事情。
這個問題不妨把一個請求過來 在TCP層面上建立連接、操作系統如何處理連接、Web容器?接收到連接對象后做了哪些事情、Spring 如何對接收到的請求進行處理都說一下,當然最終還是 落在Spring 容器內部如何處理一個請求,這個過程一定要說清楚,需要體現細節。在說前面的內容的時候,可以放心面試官不會打斷你。手寫一個棧,實現 push,pop方法,以及 max(獲取最大的元素)方法,要求時間復雜度為 O(1)。
這是一個考察數據結構的問題,一方面需要候選人對數據結構有所了了解,一方面也需要候選人對代碼有駕馭能力(畢竟要手寫代碼)。面試官會給一定的時間,在這段時間里面試官不會打擾你,并盡可能為你提供方便,比如簽字筆不好用面試官會幫你更換。據我個人經驗,凡是面對需要寫代碼的問題,都不要急著放棄,靜下心來,仔細思考,都是可以寫得不錯的。如果沒能寫出來,面試官會問你實現思路路,如果你的思路很優化,一樣可以過了這道題,但是前提是你的代碼不能一行都不寫。
對于數據結構的考察的話,我建議看一下 jdk中對于 List、Stack、Tree、Set 的實現,比如至少你要知道如果讓你實現一個單鏈表你會如何實現,比如你可能會定義一個Node節點,里面有當前節點的key和value,還有對于下一個節點的引用。如果你對這一塊的內容還不是很清楚,可以關注我的公眾號:《Java技術zhai》,我之前在上面是有詳細分享過的,對于熟悉jdk對于各種數據結構的實現,這道題是很容易易過的。JVM內存結構
這個問題需要你能畫出JVM內存結構的圖,畫出方法區、堆、程序計算器?、虛擬機棧、本地方法棧,并說出每一個部分具體是什么作用,比如哪些是線程共享的,哪些是線程獨享的,哪些地方存放了什么數據,為什么會這樣存放,哪些虛擬機參數對這些空間大小是有影響的,可以如何配置。這些都比較常規。手寫一個單例
這個基本上大多數公司都會考察的。要寫一個 基于懶漢式的 雙重檢測的單例。單例有三個比較關鍵的點:
- 私有構造方法,避免外部new出對象;
- 保證唯一性;
- 提供一個全局訪問點;
另外懶漢式雙重檢測的實現方式有三點需要注意的地方:
- 全局訪問點必須是靜態的,外界使用可以通過類直接調用;
- 在進入鎖之后還需要校驗;
- 保存單例例對象的私有變量一定要用volatile修飾,這個地方 可以多說一些,比如 volatile防止指令重排序,保證內存可見性(JVM層面 和 CPU層面 可以分別說)。volatile 這個地方能說的東西還是很多的,基本上可以與面試官再聊二十分鐘了。
- HashMap
對于 HashMap 其實一般高級崗位及以上不再會問這個東西了,一旦問了,肯定不是讓你只說一下數組+鏈表的。對于它的實現,不同版本實現方式不一樣。在jdk1.8之后,HashMap 除了數組+鏈表之外,引入了紅黑樹。那么好了,你需要說明對于引入了紅黑樹的 HashMap 如何put一個元素,以及鏈表是在何時轉化為紅黑樹的。比如首先需要知道這個元素落在哪一個數組里,獲取hashcode后并不是對數組長度取余來確定的,而是高低位異或求與來得到的。這個地方首先得知道 異或、與是做什么樣的運算的,然后說一下在HashMap中的實現,比如hashcode 無符號右移16位后和原hashcode 做異或運算,這相當于把hashcode的高16位拿過來 和 hashcode的 低16位 做異或運算,因為無符號右移后 前面高16位都補零,這就是前面說的 "高低位異或“,進而是 ”求與“,和誰求與呢,和 數組長度減1 求與。
說到這里起碼能夠證明你是看過源碼的,接下來說說你的思考。
比如 我們知道 對于hashmap 初始化容量決定了數組大小,一般我們對于數組這個初始容量的設置是有規律的,它應該是 2^n 。這個初始容量的設置影響了HashMap的效率,那又涉及到影響HashMap效率的主要因素,比如初始容量和負載因子。當已用數組達到容量與負載因子的乘積之后會進行一個rehash的過程,這個地方涉及到的 如何rehash 及各種算法如果有時間也是可以說的,沒有時間不說也沒有關系。回到剛才說的 2^n, 可以說說它為什么是2^n。當我們說什么東西為什么是這樣的時候,我們一般從兩個角度考慮,一個是這樣做有什么好處,另一個是不這樣做有什么壞處。我們剛才說到”求與“這個過程,如果不是 2^n, 會導致較多的哈希碰撞(具體原因 可以自己分析一下 或者百度一下),這個會影響HashMap的效率。
說完上面這些,既表明你看過源碼,又表明你有自己的思考了,當然也可以進一步說說它是在什么條件下以及 如何進行擴容的(如果時間允許,并且面試官也有耐心繼續聽下去)。對于put操作,這才只是第一步,找到數組的位置,接下來 要看這個位置也沒有元素,如果沒有,直接放進去就可以,如果有,要看怎么放進去,jdk1.8中 對于HashMap的實現中,是基于Node(鏈表節點) 和TreeNode(紅黑樹節點) 的,當然它們繼承了Entry。那么 如果數組當前位置已經有了元素,就得知道這個元素 是 鏈表的節點還是紅黑樹的節點,以便便 進一步確認接下來要put的元素 是以鏈表的方式插入還是以紅黑樹的方式插入,這個地方 在源碼中 進行了一個類型的判斷,如果是鏈表的節點,就以鏈表的方式把要put的節點插入到 next為null的節點上,如果是紅黑樹的節點,就要以紅黑樹的方式插入一個節點。接下來 其實不是考察的重點,但是也可以說說:
- 為什么要引入紅黑樹;
- 如何在紅黑樹中插入一個節點;
對于這兩個問題,首先 引入 紅黑樹的好處是為了提高查詢效率,要說出O(log2(n)),但是 在提高查找效率的同時也在插入的時候更加耗時,那可以說一下為什么更加耗時,自然帶出第二個問題,如何在紅黑樹中插入一個節點,比如當插入一個節點的時候我們會默認它是紅色的(這個地方可以結合紅黑樹特點說一下我們為什么默認它是紅色的,從黑色高度以及相鄰兩節點不同為紅色入手),插入后如果父節點是黑色的 就不需要動了了,但假如是紅色的,就需要進行左旋和右旋操作,如果很了解,可以細說左旋右旋如何實現,如果不不是很了了解,到此為止也ok。
說到這里,我們忽略略了一個重要的點,就是鏈表轉換為紅黑樹的條件,說出 鏈表長度到8(相當于紅黑樹開始第四層) 以及 數組大小達到64 就已經夠了了,也可以進一步說一下 鏈表是如何轉換為紅黑樹的。說完也可以說一下 ConcurrentHashMap中也是一樣的,然后接下來就引入對ConcurrentHashMap的理解,比如在什么地方會涉及到線程安全問題以及ConcurrentHashMap是如何解決的,說說CAS,說完CAS再說說AQS,自由發揮吧。
JVM四種引用類型
這個問題比較簡單,強引用、弱引用、軟引用、虛引用,說一下它們各自的特點和GC對它們的不同處理方式,再說一下常見的應用場景 或者 jdk的實現中對它們的使用,比如 ThreadLocal 的靜態內部類 ThreadLocalMap,它的Key是弱引用的,也可以說一下 在你的理解中 為什么它是弱引用的,假如不是 會怎么樣。SpringBoot 啟動過程
這個主要是從它基于Spring的事件發布和監聽機制開始說起 就沒什么問題。
二輪
繼續考察Java基礎,和對應用技術的掌握,比如過往項目中所用的一些框架,在這一輪中會被問到。
類加載過程
加載 鏈接 初始化,鏈接又分為驗證準備和解析,每一個階段 是做了什么 要說清楚。Object a = new Object(); 這行代碼做了了哪些事情,需要從類加載開始說起,這個相當于上面問題的延續,所以 一定要清楚 每一個環節 做了哪些事情的,否則這個問題不可能說清楚。說完類加載的過程 再說一下 開辟內存空間、初始化內存空間以及把內存地址賦值給變量a,接下來可以進一步說一下JVM 或者CPU層面對指令的優化,以及在某些時刻我們需要避免它做這樣的優化,比如在單例中我們的實例需要用volatile修飾 避免指令重排序(可以說一下 在new一個對象的過程中如果指令重排序了會導致什么結果)。
接下來主要是對過往項目中用到的框架、工具的考察
- maven的熟練程度,比如問問 <scope> 有哪些類型
- Linux命令行的熟練程度,比如 問問
() 區別
- 消息隊列列的熟練程度,比如問問Kafka分區,如何分區等等(因為我過往項目經驗中寫了kafka,所以才會被問及,如果寫了其他消息隊列,也可能會被問及)
- Netty,從NIO開始說 肯定是沒錯的,再說說Netty的實現方式,以及它除了IO之外還干了哪些事情。
三輪
這一輪主要考察對于過往項目的業務理解
根據過往項目經驗 依次介紹業務
這就需要 在面試之前 把自己的做過的項目好好總結一下,它們主要做的業務是什么,解決了什么問題,架構是什么樣的,以及你在其中做了哪些工作。這個地方一定要準備充分,至少要能扛得住面試官三連問。否則會被認為 你不太清楚你們之前做的到底是什么,那你在業務能力方面 可能是不太match的。你有什什么問題想問面試官的
這個地方因人而異,但無論怎樣,都不要什么都不問,至少你要表現一點對于崗位的興趣吧。
比如問一下 公司業務,團隊構成,技術棧,以及你所應聘的這個崗位大概做哪些工作
四輪
HR面試。這一輪可以說是斗智斗勇的一個環節,會考察一些軟技能、個人成長、職業素質,也會問一下期望薪資。
本次快手面經分享完畢,覺得有收獲的朋友可以幫我點個關注與轉發!
贈人玫瑰,手有余香,我是不那么正經的技術zhai,歡迎你的關注~