參考鏈接:https://www.nowcoder.com/experience/639
用於彙總Java後端各個校招、社招、實習面經,附自己答案
🔥1. 一面
- ConcurrentHashMap原理:JDK1.8之後是volatile定義的Node數組 + 鏈表 + 紅黑樹,對數組頭結點加鎖來保證線程安全。具體put加鎖過程是採用synchronized + cas自旋實現,而get是voaltile,就可以直接讀
- CopyOnWriteArrayList原理:適合讀多寫少場景,內部添加,複製都是對底層賦值的操作實現,由於list,set非線程安全,所以內部修改數據加了reentranlock鎖
synchronized
做的優化手段有哪些- 鎖升級、鎖粗化、鎖消除
JVM
垃圾回收器: Parallel Scavenge + Parallel old。但是網上說的比較多的都是CMS + G1,後面得學下。- 身份證號用主鍵索引是否合適呢: 肯定是不合適,因爲主鍵索引在B+數中使用遞增id最好,而且身份證不一定都是數字,而且太長的主鍵索引查詢也會影響效率
- TCP連接已經建立了,但是客戶端故障了,會怎麼樣
- TCP會開啓keep-alive,若長期未收到相應就主動關閉連接
- 若服務器崩潰,會發送RST包讓客戶端關閉鏈接
- 計算機的交換空間瞭解嗎:內存不夠用,到輔存中置換空間
Spring
的自動注入底層調用了什麼方法:set注入,有@Autowired,@resource,@inject這幾種註解IOC
如何實現的:控制反轉,使用工廠模式和反射機制實現對象創建由spring創建- 數據庫有上百億條數據,要輸出到一個文本文件中,談談有哪些值得思考的地方:
- 使用多線程異步讀取數據庫百億數據,控制線程數,避免內存OOM
- 使用buffer緩存流操作文件的IO
- 多線程異步輸出到各個文件後,最後做文件合併
- 假設說我寫一半,服務掛掉了,重啓之後我肯定不想重頭開始,而是繼續讀取,怎麼處理
- 斷點續傳:randomAccessFile,每次往裏面輸入數據都先讀取文件長度
🔥2.二面
1. 操作系統`32`位和`64`位有什麼區別
1. 核心區別:cpu處理器一次能處理數據的最大位數
2. 64位可以兼容32,反之卻不行
二面其餘問題都是一些實際項目業務的了
🔥2.HR面
HR面都是問的自我評價和一些學習路線之類的了