本篇面經來自於羣裏粉絲朋友的分享,但願對你有所幫助!
快手高開及以上職級面試 是沒有筆試或者機試的,因此從第一輪開始就是直接面對面試官。面試
主要考察對Java基礎的理解和深刻程度。算法
這個問題 最好能夠多說一點,好比 對於IOC,不妨把Bean 如何加載、如何初始化以及如何註冊到IOC容器中的詳細過程說一下, 涉及BeanDefinition、BeanFactory也深刻細節聊一下。數組
這個問題不妨把一個請求過來 在TCP層面上創建鏈接、操做系統如何處理鏈接、Web容器器接收到鏈接對象後作了哪些事情、Spring 如何對接收到的請求進行處理都說一下,固然最終仍是 落在Spring 容器內部如何處理一個請求,這個過程必定要說清楚,須要體現細節。在說前面的內容的時候,能夠放心面試官不會打斷你。安全
這是一個考察數據結構的問題,一方面須要候選人對數據結構有所了了解,一方面也須要候選人對代碼有駕馭能力(畢竟要手寫代碼)。面試官會給必定的時間,在這段時間里面試官不會打擾你,並儘量爲你提供方便,好比簽字筆不好用面試官會幫你更換。據我我的經驗,凡是面對須要寫代碼的問題,都不要急着放棄,靜下心來,仔細思考,都是能夠寫得不錯的。若是沒能寫出來,面試官會問你實現思路路,若是你的思路很優化,同樣能夠過了這道題,可是前提是你的代碼不能一行都不寫。數據結構
對於數據結構的考察的話,我建議看一下 jdk中對於 List、Stack、Tree、Set 的實現,好比至少你要知道若是讓你實現一個單鏈表你會如何實現,好比你可能會定義一個Node節點,裏面有當前節點的key和value,還有對於下一個節點的引用。若是你對這一塊的內容還不是很清楚,能夠關注個人公衆號:《Java技術zhai》,我以前在上面是有詳細分享過的,對於熟悉jdk對於各類數據結構的實現,這道題是很容易易過的。架構
這個問題須要你能畫出JVM內存結構的圖,畫出方法區、堆、程序計算器器、虛擬機棧、本地方法棧,並說出每個部分具體是什麼做用,好比哪些是線程共享的,哪些是線程獨享的,哪些地方存放了什麼數據,爲何會這樣存放,哪些虛擬機參數對這些空間大小是有影響的,能夠如何配置。這些都比較常規。框架
這個基本上大多數公司都會考察的。要寫一個 基於懶漢式的 雙重檢測的單例。單例有三個比較關鍵的點:maven
另外懶漢式雙重檢測的實現方式有三點須要注意的地方:工具
對於 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,自由發揮吧。
這個問題比較簡單,強引用、弱引用、軟引用、虛引用,說一下它們各自的特色和GC對它們的不同處理方式,再說一下常見的應用場景 或者 jdk的實現中對它們的使用,好比 ThreadLocal 的靜態內部類 ThreadLocalMap,它的Key是弱引用的,也能夠說一下 在你的理解中 爲何它是弱引用的,假如不是 會怎麼樣。
這個主要是從它基於Spring的事件發佈和監聽機制開始提及 就沒什麼問題。
繼續考察Java基礎,和對應用技術的掌握,好比過往項目中所用的一些框架,在這一輪中會被問到。
加載 連接 初始化,連接又分爲驗證準備和解析,每個階段 是作了什麼 要說清楚。
這一輪主要考察對於過往項目的業務理解
這就須要 在面試以前 把本身的作過的項目好好總結一下,它們主要作的業務是什麼,解決了什麼問題,架構是什麼樣的,以及你在其中作了哪些工做。這個地方必定要準備充分,至少要能扛得住面試官三連問。不然會被認爲 你不太清楚大家以前作的究竟是什麼,那你在業務能力方面 多是不太match的。
這個地方因人而異,但不管怎樣,都不要什麼都不問,至少你要表現一點對於崗位的興趣吧。
好比問一下 公司業務,團隊構成,技術棧,以及你所應聘的這個崗位大概作哪些工做
HR面試。這一輪能夠說是鬥智鬥勇的一個環節,會考察一些軟技能、我的成長、職業素質,也會問一下指望薪資。
本次快手面經分享完畢,以爲有收穫的朋友能夠幫我點個關注與轉發!
若是你也想加入進來和你們交流或者想要獲取更多面經信息,能夠關注個人公衆號:《Java技術zhai》獲取。贈人玫瑰,手有餘香,我是不那麼正經的技術zhai,歡迎你的關注~