四面快手、終拿Offer,想告訴你的一些事情

本篇面經來自於羣裏粉絲朋友的分享,但願對你有所幫助!

快手高開及以上職級面試 是沒有筆試或者機試的,因此從第一輪開始就是直接面對面試官。面試

一輪

主要考察對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內存結構的圖,畫出方法區、堆、程序計算器器、虛擬機棧、本地方法棧,並說出每個部分具體是什麼做用,好比哪些是線程共享的,哪些是線程獨享的,哪些地方存放了什麼數據,爲何會這樣存放,哪些虛擬機參數對這些空間大小是有影響的,能夠如何配置。這些都比較常規。框架

  • 手寫一個單例

這個基本上大多數公司都會考察的。要寫一個 基於懶漢式的 雙重檢測的單例。單例有三個比較關鍵的點:maven

  1. 私有構造方法,避免外部new出對象;
  2. 保證惟一性;
  3. 提供一個全局訪問點;

另外懶漢式雙重檢測的實現方式有三點須要注意的地方:工具

  1. 全局訪問點必須是靜態的,外界使用能夠經過類直接調用;
  2. 在進入鎖以後還須要校驗;
  3. 保存單例例對象的私有變量必定要用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的節點上,若是是紅黑樹的節點,就要以紅黑樹的方式插入一個節點。接下來 其實不是考察的重點,可是也能夠說說:

  1. 爲什麼要引入紅黑樹;
  2. 如何在紅黑樹中插入一個節點;

對於這兩個問題,首先 引入 紅黑樹的好處是爲了提升查詢效率,要說出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一個對象的過程當中若是指令重排序了會致使什麼結果)。
  • 接下來主要是對過往項目中用到的框架、工具的考察
  1. maven的熟練程度,好比問問 <scope> 有哪些類型
  2. Linux命令行的熟練程度,好比 問問 ${} 和 $() 區別
  3. 消息隊列列的熟練程度,好比問問Kafka分區,如何分區等等(由於我過往項目經驗中寫了kafka,因此纔會被問及,若是寫了其餘消息隊列,也可能會被問及)
  4. Netty,從NIO開始說 確定是沒錯的,再說說Netty的實現方式,以及它除了IO以外還幹了哪些事情。

三輪

這一輪主要考察對於過往項目的業務理解

  • 根據過往項目經驗 依次介紹業務

這就須要 在面試以前 把本身的作過的項目好好總結一下,它們主要作的業務是什麼,解決了什麼問題,架構是什麼樣的,以及你在其中作了哪些工做。這個地方必定要準備充分,至少要能扛得住面試官三連問。不然會被認爲 你不太清楚大家以前作的究竟是什麼,那你在業務能力方面 多是不太match的。

  • 你有什什麼問題想問面試官的

這個地方因人而異,但不管怎樣,都不要什麼都不問,至少你要表現一點對於崗位的興趣吧。

好比問一下 公司業務,團隊構成,技術棧,以及你所應聘的這個崗位大概作哪些工做

四輪

HR面試。這一輪能夠說是鬥智鬥勇的一個環節,會考察一些軟技能、我的成長、職業素質,也會問一下指望薪資。

本次快手面經分享完畢,以爲有收穫的朋友能夠幫我點個關注與轉發!

若是你也想加入進來和你們交流或者想要獲取更多面經信息,能夠關注個人公衆號:《Java技術zhai》獲取。

贈人玫瑰,手有餘香,我是不那麼正經的技術zhai,歡迎你的關注~

相關文章
相關標籤/搜索