北郵碩士分享秋招經驗:騰訊、阿里…面經,紅黑樹、B+樹全用上了

前言:

職場就像圍城,我們每一個職場人總是以“牆外”的視角羨慕著“牆內”的世界,而也許你的生活也出現在別人的夢中。希望“互聯網坊間八卦”能成為一個分享和了解不同生活的平臺。

今天,筆者給大家分享一位19屆應屆生秋招的遭遇。讓我們一起了解一下應屆生最原始的求職生活狀態。希望這些“乾貨”能讓你認識到不一樣的秋招。

北郵碩士分享秋招經驗:騰訊、阿里…面經,紅黑樹、B+樹全用上了


寫在前面


樓主是北郵真渣碩,之前天真地認為實習期間活兒幹完了就能轉正,就沒有準備提前批,也幾乎完美錯過了9月秋招正式批。倒在亞馬遜的轉正答辯後(感到痛心,捨不得組裡和善的大佬們,技術好又有耐心又有趣),10月正式踏上秋招,目標是JAVA後臺研發。至此告一段落,雖然沒拿到什麼牛逼的offer,但好歹互聯網大廠基本都面了,寫下來讓自己以後複習,也算回饋網友。


話不多說,面試問題幾乎集中在JAVA基礎、JVM、算法、數據庫(MySQL、Redis)、計算機網絡、操作系統等方面,會分類進行列舉,限於篇幅項目相關的問題就不寫出了。




高頻問題


後面面經挺長的,嫌太長的可以只看這部分。基本上你在簡歷的技能樹上寫了以下關鍵詞,那這些高頻問題你會特別眼熟,有些會附上解答,有寫錯的地方歡迎指正~


設計模式


  • 單例模式 懶漢、餓漢、雙重校驗鎖、靜態內部類
  • 工廠模式


JAVA基礎


  • 集合類的結構 Iterator、Collection(List、Set、Queue)、Map
  • ArrayList和LinkedList的區別


HashMap


  • 底層結構 數組 + 鏈表
  • Put 的過程
  • 為什麼長度是2的倍數 找索引時 key 的 hash 值與數組的長度值減 1 進行與運算,長度為 2 的倍數時能減少碰撞
  • JDK 1.7 和 1.8 中 HashMap 的區別 1.8 增加紅黑樹、頭插變為尾插、擴容後元素位置要麼在原位置,要麼在原位置 + 擴容前舊容量
  • 為什麼線程不安全 擴容時鏈表可能形成閉環
  • ConcurrentHashMap 怎麼保證線程安全
  • ConcurrentHashMap 和 HashMap 區別


線程池


  • 線程池常用參數 核心線程數、最大線程數、阻塞隊列、線程最大存活時間
  • 線程池工作流程
  • 線程池的類別和區別
  • 阻塞隊列的類別和區別


JVM


  • 內存結構和各自存放的內容 方法區、堆、虛擬機棧、本地方法棧、程序計數器
  • 新生代和老年代垃圾回收算法 新生代 -> 複製,老年代 -> 標記-整理(CMS用的標記-清除)
  • CMS/G1的流程 初始標記 -> 併發標記 -> 重新標記 -> 併發清除
  • CMS/G1的特點和區別 CMS:儘可能減少停頓時間,採用標記-清除,會造成內存碎片化 G1:可以預測停頓時間,採用標記-整理,減少內存碎片化, 將內存劃分為 region 粒度
  • 判斷垃圾是否可以回收的方法 引用計數法、可達性分析法
  • 哪些對象可以作為GC ROOT


Spring


  • IOC 和 AOP 的含義和原理
  • Spring、SpringBoot、SpringMVC 的區別
  • SpringBoot 的啟動流程
  • Bean 的生命週期
  • SpringMVC 的流程


MySQL


事務


  • 什麼是事務
  • 事務的特性(ACID),詳細說明各個特性的含義 原子性、一致性、隔離性、持久性
  • 事務隔離級別 未提交讀 -> 已提交讀 -> 可重複讀 -> 串行化
  • 髒讀、不可重複讀、幻讀的區別
  • 事務隔離級別怎麼實現預防上述問題(eg: 可重複讀怎麼實現預防不可重複讀)


索引


  • 常用索引(B樹、Hash)
  • 聚簇索引和非聚簇索引的區別
  • B樹和B+樹的區別 B+樹的非葉子節點不保存數據,所以磁盤頁能容納更多節點元素,更“矮胖” B+樹查詢必須查找到葉子節點,B樹只要匹配到即可不用管元素位置,因此B+樹查找更穩定(也不慢) 對於範圍查找來說,B+樹只需遍歷葉子節點鏈表即可,B樹卻需要重複地中序遍歷


Redis


  • Redis 的五種數據結構 String、Hash、List、Set、Zset(SortSet)
  • Redis 為什麼快 純內存、單線程、IO多路複用(一般會繼續問IO多路複用相關問題)
  • Redis 持久化 RDB、AOF
  • Redis 高可用 哨兵機制、Redis Cluster、持久化(上面那個)


計算機網絡


  • 點擊一個URL到頁面返回,發生了什麼 客戶端傳給服務端時經過 TCP/IP 四層模型,中途依次加入HTTP報文、TCP報文、IP報文、MAC報文,然後逆序依次拆包
  • OSI 七層模型 & TCP/IP 四層模型


TCP & UDP


  • TCP 三次握手,四次揮手的流程(最好能畫圖,說明各階段狀態)
  • 為什麼需要三次握手 防止已過期的連接再次傳到被連接的主機
  • 為什麼需要四次揮手 / 斷開連接時為什麼比建立連接多一次 服務端的 ACK 和 FIN 一般都會分開發送,ACK 表示自己收到了客戶端的斷開請求(但還有數據沒傳輸完),FIN 表示自己傳輸完了數據
  • TCP 和 UDP 的區別
  • TIME_WAIT 的作用 保證客戶端發送的最後一個ACK報文能夠到達服務器 防止類似與“三次握手”中提到了的“已經失效的連接請求報文段”出現在本連接中。客戶端發送完最後一個確認報文後,在這個2MSL時間中,就可以使本連接持續的時間內所產生的所有報文段都從網絡中消失


HTTPS


  • HTTPS的優勢 CA證書認證、加密傳輸
  • HTTPS建立連接流程
  • 為什麼傳輸過程中採用對稱加密,協商時採用非對稱加密 對稱加密快


操作系統


進程 & 線程


  • 進程和線程的區別
  • 進程間通信方式 管道、消息隊列、信號量、共享內存
  • 線程間通信方式 消息隊列、全局變量


Linux(幾乎為Linux命令)


  • 查找某個進程(ps aux |grep threadId)
  • 殺掉某個進程(kill,參數添加-9表示強制執行)
  • 查看某個端口是否被佔用(netstat -anp |grep threadId)
  • 實時查看進程狀態(top)


算法


  • 最大子序列和
  • 反轉鏈表
  • 數組中查找兩數之和為K的序列對




坎坷面經


大家可以找找上面的高頻問題在下面的面試中也出現過多少次(笑),針對每個公司會有一個小結(碎碎念)。


騰訊-醫療


一面


MySQL


  • 事務的特性
  • 如何刪除表中的所有數據,delete和truncate的區別
  • char, varchar, text的區別
  • 一張表裡數據量大,慢查詢怎麼辦


Redis


  • redis 的數據結構
  • zset 的底層結構
  • redis 的常用命令


操作系統


  • 多線程和多進程的區別
  • 進程間通信方式
  • 線程間通信方式


計算機網絡


  • TCP 三次握手,四次揮手
  • TCP 和 UDP 的區別
  • UDP 如何重組數據
  • 應用層和網絡層是幹嘛的
  • ARP 是網絡層的嗎


騰訊-地圖


一面


MySQL


  • MySQL 引擎默認的隔離等級
  • MySQL 有哪些鎖
  • 執行 select 和 update 會如何加鎖


計算機網絡


  • TCP和UDP的區別
  • TCP和UDP的報文頭內容
  • HTTP HTTP屬於 TCP 還是 UDP HTTP 1.1比1.0多了什麼 HTTP Request Header 中有哪些內容 如何判斷是否是長連接
  • DNS 屬於 TCP 還是 UDP,原理
  • Ping 使用的什麼協議,原理


操作系統


  • 進程和線程區別
  • Linux進程有哪幾種狀態
  • Linux查找某個進程


算法


  • 二分查找
  • 最大子序列和


騰訊-小結


可以看出騰訊對於計算機網絡方面的知識要求蠻多的,光熟悉 TCP、UDP、HTTP 相關這樣基礎的面試題是hold不住面試官的。

樓主目前在開發中還沒用到過計算機網絡的知識去解決問題,但前人的經驗告訴我們後臺系統多半會遇到網絡擁堵的情況,這個時候計算機網絡就能派上用場了(幫助定位問題,調 bug)




阿里-健康


一面


JAVA


  • HashMap原理,用紅黑樹解決什麼問題


MySQL


  • B+樹的原理和優勢


算法


  • 硬盤中有10G數據,內存1G,如何排序(多路歸併排序)
  • 最大子序列和,除了動態規劃還能怎麼做


阿里-高德


一面


數據庫


  • delete 和 truncate 區別
  • 如果索引值為null,走不走索引


JAVA


  • 常見的單例寫法


JVM


  • 新生代和老年代的區別
  • 大量大對象進入老年代會有什麼問題(頻繁觸發full GC)
  • 有很多個大對象,應該如何改進


開放式


  • 如何設計一個查詢附近商家的功能


二面


開放式


  • 爬蟲爬千萬個手機號碼,如何統計每個手機號碼的出現次數


阿里-小結


阿里對於算法方面的考核會更加嚴格,普通的算法題期待你有多種解法,並且傾向於給你一個具體問題讓你解決,然而我開放式問題都答得不咋樣
開放式問題一般都是的業務問題(數據量大、用戶量大(高併發場景)等等),需要衡量業務是正確穩定至上還是效率至上(同步、異步),還有資源消耗(空間換時間、分佈式會導致調度的額外開銷),嘗試將大問題分解,自上而下/自下而上去解決




美團-金融


一面


JVM


  • JVM的結構
  • 新生代和老年代的垃圾回收算法
  • 虛擬機棧和本地方法棧的區別
  • 類信息會加載到JVM哪個區域


JAVA基礎


  • HashMap 和 ConcurrentHashMap 的區別
  • final 的作用,加在變量、方法、類的區別
  • 新建一個 string 會創建幾個對象
  • 哪些類是線程安全的
  • 線程池的參數;為什麼需要超出最大容量的策略
  • ThreadLocal瞭解嗎


Spring


  • AOP的實現原理
  • @Autowired和@Resource的區別
  • 什麼情況下會用@Resource


MySQL


  • B+樹的優勢
  • 悲觀鎖和樂觀鎖瞭解嗎
  • 數據庫如何實現樂觀鎖


設計模式


  • 工廠模式怎麼理解
  • 單例模式有哪幾種實現方式
  • 懶漢和餓漢的區別,懶漢的缺點


算法


  • 反轉鏈表


二面


JAVA基礎


  • HashMap 和 ConcurrentHashMap 的區別
  • hash 衝撞怎麼辦?如何 rehash
  • HashMap 的遍歷方式
  • 為什麼 HashMap 是線程不安全的
  • volatile 和 synchronized 的區別


Spring


  • SpringBoot 的優勢
  • SpringMVC 的 MVC 指什麼?好處呢


Redis


  • 主從結構瞭解嗎
  • 宕機之後如何恢復數據


消息隊列


  • rabbitmq 和 kafka 的區別
  • rabbitmq 如何保證事務
  • 消息隊列的優勢


美團-數據平臺


一面


JAVA基礎


  • ConcurrentHashMap 的特點
  • JUC 包下其他併發類瞭解過嗎
  • 多個消費者生產者,如何處理同一段數據(消費者-生產者模型)


操作系統


  • 線程間通信的方式


JVM


  • 闡述 JMM 內存模型
  • 垃圾回收算法有哪些
  • 標記-整理會觸發 Stop The World 嗎
  • 什麼情況下觸發mirror GC
  • JVM 結構
  • 新建的字符串會存到哪


消息隊列


  • 設計時應該考慮什麼問題
  • 如何保證高可用


算法


  • n個有序數組,找出 Top k


美團-到家


一面


JVM


  • JVM 存在的優勢
  • 通過什麼方式來判斷是否回收
  • 哪些對象可以當 GC root
  • 虛擬機棧的對象為什麼能當 root
  • 堆和棧區別


JAVA基礎


  • ArrayList 和 LinkedList區別
  • HashMap 的底層數據結構
  • JDK 1.8 中 HashMap 有哪些變化
  • 靜態變量和非靜態變量的區別
  • 類和對象的區別
  • Synchronized 和 Lock 區別
  • Lock 底層實現
  • Exception 和 Error 的區別
  • 線程池常用參數
  • 在什麼情況下使用這些參數(線程池工作流程)


設計模式


  • 手撕單例模式的雙重檢驗鎖
  • 為什麼要有兩次檢驗


Redis


  • Redis 為什麼快
  • Redis 如何保證可用


MySQL


  • B樹索引和hash索引區別
  • 聚簇索引和非聚簇索引


計算機網絡


  • HTTPS 建立連接流程


算法


  • LeetCode11 water
  • 給定一個數,通過調換順序,找到比這個數大的最小數


分享到:


相關文章: