最可惜的一次,滴滴二面問題基本上都能答上,可惜出了道剛好沒做過的hot100,然后就掛了,唉...一面面經(jīng)面試問題與知識點總結(jié)1. 項目經(jīng)歷1. 第一個項目 技術(shù)點: 樂觀鎖解決超賣問題(如秒殺場景)。 Redis分布式鎖實現(xiàn)“一人一單”限制。 擴展問題: 分布式鎖的實現(xiàn)細節(jié)(如Redisson的底層原理)。 超賣問題的其他解決方案(如令牌桶限流)。 2. 第二個項目 技術(shù)點: 基于Redis發(fā)布訂閱機制實現(xiàn)線程池參數(shù)動態(tài)調(diào)整。 配置中心設(shè)計與定時任務(wù)上報線程池狀態(tài)。 擴展問題: 對比Apollo、Nacos等配置中心的實現(xiàn)差異。 線程池參數(shù)動態(tài)調(diào)整的性能影響(如核心線程數(shù)修改的底層邏輯)。 2. Java基礎(chǔ)1. HashMap底層實現(xiàn) 回答要點: JDK1.8前:數(shù)組+鏈表;JDK1.8后:鏈表長度≥8且數(shù)組長度≥64時轉(zhuǎn)紅黑樹。 樹化后若節(jié)點減少,紅黑樹會退化為鏈表(節(jié)點數(shù)≤6時)。 擴展問題: 樹化閾值為8的原因(哈希沖突概率與性能權(quán)衡)。 2. ConcurrentHashMap線程安全 回答要點: JDK1.7分段鎖;JDK1.8后CAS+synchronized鎖桶節(jié)點。 擴展問題: ConcurrentHashMap的size()方法實現(xiàn)(分段統(tǒng)計再求和)。 3. 事務(wù)ACID與隔離級別 回答要點: MySQL默認隔離級別為可重復讀(通過MVCC實現(xiàn))。 臟讀、不可重復讀、幻讀的解決方式。 擴展問題: MVCC中ReadView的生成邏輯(活躍事務(wù)ID列表)。 3. 數(shù)據(jù)庫1. 索引與B+樹 回答要點: B+樹非葉子節(jié)點僅存索引值,葉子節(jié)點通過鏈表串聯(lián)(支持高效范圍查詢)。 聯(lián)合索引需滿足最左匹配原則(如索引(a,b,c)需查詢條件包含a)。 擴展問題: 索引下推(ICP)優(yōu)化原理。 2. 紅黑樹 vs B+樹 回答要點: 紅黑樹為二叉平衡樹,調(diào)整頻繁;B+樹為多路平衡樹,層高更低(減少磁盤IO)。 4. Redis1. 持久化方式 回答要點: RDB:定時快照,恢復快但可能丟數(shù)據(jù)。 AOF:追加命令日志,數(shù)據(jù)更安全但文件較大。 擴展問題: AOF重寫機制(壓縮命令為最終狀態(tài))。 2. 緩存擊穿解決方案 回答要點: 空值緩存 + 布隆過濾器過濾無效請求。 互斥鎖防止大量請求穿透到數(shù)據(jù)庫。 5. Spring1. IOC與單例模式 回答要點: Spring Bean默認單例(通過單例注冊表管理)。 單例的線程安全問題(無狀態(tài)Bean vs 有狀態(tài)Bean)。 6. 算法題題目:二叉樹層序遍歷(LeetCode 102)。二面---#### **1. JVM 垃圾回收算法**- **問題**: 解釋 JVM 中標記清除、標記整理、標記復制三種垃圾回收算法的原理、優(yōu)缺點,以及分代回收中新生代和老年代分別使用的算法。- **擴展追問**: - 為什么新生代使用標記復制算法? - 老年代為何更適合標記整理而非標記清除? - 內(nèi)存碎片問題在不同算法中的表現(xiàn)?---#### **2. ConcurrentHashMap 實現(xiàn)原理**- **問題**: 對比 HashMap 和 ConcurrentHashMap 的線程安全實現(xiàn),解釋分段鎖(JDK 1.7)或 CAS + synchronized(JDK 1.8)的底層機制。- **擴展追問**: - 分段鎖如何保證并發(fā)安全? - JDK 1.8 中為何放棄分段鎖? - ConcurrentHashMap 的 get 操作是否需要加鎖?---#### **3. 生產(chǎn)者消費者模型實現(xiàn)**- **問題**: 設(shè)計一個線程安全的阻塞隊列,要求支持多生產(chǎn)者、多消費者,并在隊列滿/空時阻塞等待。- **擴展追問**: - 如何通過鎖和條件變量(如 `ReentrantLock` + `Condition`)實現(xiàn)? - 為什么不能直接使用 `BlockingQueue`? - 如何處理線程喚醒的“虛假喚醒”問題?---#### **4. LRU 緩存設(shè)計**- **問題**: 實現(xiàn)一個 LRU 緩存,要求 `get` 和 `put` 操作的時間復雜度為 O(1)。- **擴展追問**: - 為什么選擇哈希表 + 雙向鏈表的結(jié)構(gòu)? - 如何維護鏈表節(jié)點的順序? - 單鏈表能否實現(xiàn)?時間復雜度如何變化?---#### **5. 算法題:旋轉(zhuǎn)數(shù)組的二分查找**- **問題**: 給定一個升序數(shù)組經(jīng)未知次數(shù)左旋后的結(jié)果(如 `[4,5,6,7,0,1,2]`),設(shè)計算法在 O(log n) 時間內(nèi)找到目標值。- **擴展追問**: - 如何確定旋轉(zhuǎn)點(分界點)? - 如何處理二分后左右區(qū)間的有序性? - 代碼實現(xiàn)中的邊界條件(如數(shù)組完全有序、重復元素)?---#### **面試評價方向**1. **基礎(chǔ)深度**:JVM 垃圾回收算法、并發(fā)容器的底層實現(xiàn)。 2. **設(shè)計能力**:生產(chǎn)者消費者模型、LRU 緩存的設(shè)計思路。 3. **算法思維**:二分查找變種問題的分析與編碼能力。 4. **溝通表達**:能否清晰闡述項目亮點(如樂觀鎖、分布式鎖、動態(tài)線程池)。 ---