12.29 快手面試題目|(內有真實面試實踐經驗分享)

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


快手面試題目|(內有真實面試實踐經驗分享)


一輪

主要考察對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,還有對於下一個節點的引用。如果熟悉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的節點上,如果是紅黑樹的節點,就要以紅黑樹的方式插入一個節點。

接下來其實不是考察的重點,但是也可以說說,就是:

(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的熟練程度
    比如問問 有哪些類型
  2. Linux命令⾏的熟練程度
    比如 問問 ${} 和 $() 區別
  3. 消息隊列的熟練程度

    比如問問Kafka分區,如何分區 等等(因為我過往項⽬經驗中寫了kafka,所以才會被問及,如果寫了其他消息隊列,也可能會被問及)
  4. Netty
    從NIO開始說 肯定是沒錯的,再說說Netty的實現⽅式,以及它除了IO之外還⼲了哪些事情。

三輪

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

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

這就需要在面試之前把自己的做過的項目好好總結一下,它們主要做的業務是什麼,解決了什麼問題,架構是什麼樣的,以及你在其中做了哪些⼯作。這個地方一定要準備充分,少要能扛得住面試官三連問。否則會被認 你不太清楚你們之前做的到底是什麼,那你在業務能力方便可能是不太match的。

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

這個地方因人而異,但無論怎樣,都不要什麼都不問,至少你要表現一點對於崗位的興趣吧。如問一下公司業務,團隊構成,技術棧,以及你所應聘的這個崗位大概做哪些工作。

四輪

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


分享到:


相關文章: