前言:
職場就像圍城,我們每一個職場人總是以「牆外」的視角羨慕著「牆內」的世界,而也許你的生活也出現在別人的夢中。希望「網際網路坊間八卦」能成為一個分享和了解不同生活的平台。
今天,筆者給大家分享一位19屆應屆生秋招的遭遇。讓我們一起了解一下應屆生最原始的求職生活狀態。希望這些「乾貨」能讓你認識到不一樣的秋招。
寫在前面
樓主是北郵真渣碩,之前天真地認為實習期間活兒幹完了就能轉正,就沒有準備提前批,也幾乎完美錯過了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
- 給定一個數,通過調換順序,找到比這個數大的最小數