溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

有哪些HashMap面試專題

發布時間:2021-10-25 16:38:12 來源:億速云 閱讀:187 作者:iii 欄目:編程語言
# 有哪些HashMap面試專題

## 目錄
1. [HashMap核心原理](#1-hashmap核心原理)  
2. [哈希沖突解決](#2-哈希沖突解決)  
3. [擴容機制](#3-擴容機制)  
4. [線程安全問題](#4-線程安全問題)  
5. [JDK8優化](#5-jdk8優化)  
6. [常見面試題](#6-常見面試題)  
7. [性能調優](#7-性能調優)  

---

## 1. HashMap核心原理

### 1.1 數據結構
HashMap采用 **數組+鏈表+紅黑樹**(JDK8+)的復合結構:
- **數組(桶數組)**:存儲鏈表頭節點或紅黑樹根節點  
- **鏈表**:解決哈希沖突(拉鏈法)  
- **紅黑樹**:當鏈表長度≥8且桶數組長度≥64時轉換  

```java
// JDK8中的Node定義
static class Node<K,V> implements Map.Entry<K,V> {
    final int hash;
    final K key;
    V value;
    Node<K,V> next; // 鏈表指針
}

1.2 哈希計算

static final int hash(Object key) {
    int h;
    return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
}
  • 高位擾動:通過^ (h >>> 16)減少哈希碰撞
  • null鍵處理:null鍵固定放在桶數組索引0位置

2. 哈希沖突解決

2.1 拉鏈法

  • 沖突時在桶位置形成鏈表
  • JDK8改為尾插法(避免多線程擴容死循環)

2.2 紅黑樹轉換條件

條件 閾值
鏈表轉紅黑樹 TREEIFY_THRESHOLD=8
紅黑樹轉鏈表 UNTREEIFY_THRESHOLD=6
最小樹化容量 MIN_TREEIFY_CAPACITY=64

為什么閾值是8?
根據泊松分布,哈希沖突達到8的概率僅為0.00000006,樹化是極端情況的兜底策略


3. 擴容機制

3.1 擴容觸發條件

  • 元素數量 > 容量 × 負載因子(默認0.75)
  • 鏈表長度≥8但桶數組長度<64時優先擴容

3.2 擴容過程

  1. 創建新數組(2倍原大?。?br>
  2. rehash:重新計算節點位置
    • JDK8優化:節點新位置=原位置 或 原位置+舊容量
    if ((e.hash & oldCap) == 0) {
       // 保持原索引
    } else {
       // 新索引 = 原索引 + oldCap
    }
    

4. 線程安全問題

4.1 典型問題

  • 死循環:JDK7頭插法導致環形鏈表
  • 數據丟失:并發put覆蓋值
  • size不準確:未同步的計數器

4.2 解決方案

方案 實現原理 適用場景
Hashtable 全表synchronized 不推薦
Collections.synchronizedMap 包裝器模式 低并發
ConcurrentHashMap 分段鎖/CAS 高并發

5. JDK8優化

5.1 主要改進

  1. 鏈表轉紅黑樹
  2. 尾插法替代頭插法
  3. 擴容時rehash優化
  4. 計算size的優化(CounterCell)

5.2 性能對比

操作 JDK7 JDK8
get O(n)最壞 O(logn)最壞
put 頭插法 尾插法
擴容 全量rehash 位置預測

6. 常見面試題

6.1 基礎篇

  1. HashMap的底層數據結構?

    • 數組+鏈表+紅黑樹(JDK8+)
  2. 為什么重寫equals必須重寫hashCode?

    • 確保相同對象有相同hash值,否則會導致HashMap無法正確匹配鍵值

6.2 進階篇

  1. HashMap為什么線程不安全?

    • 示例:線程A、B同時執行put可能導致數據覆蓋
  2. 負載因子為什么默認0.75?

    • 空間與時間的折中(數學證明0.75時碰撞概率較低)

6.3 源碼分析

// JDK8的putVal核心邏輯
final V putVal(int hash, K key, V value, boolean onlyIfAbsent) {
    // 1. 檢查桶數組是否初始化
    // 2. 計算桶下標:(n-1) & hash
    // 3. 處理空桶情況
    // 4. 處理鏈表/紅黑樹插入
    // 5. 檢查擴容閾值
}

7. 性能調優

7.1 優化建議

  1. 初始化容量
    
    // 預期存儲100個元素時
    new HashMap<>(128); // 100/0.75=133,取2^n的128
    
  2. 鍵對象設計
    • 使用不可變對象作為key
    • 實現良好的hashCode()(如String的31哈希)

7.2 監控工具

  • JVisualVM:查看HashMap實例內存占用
  • Arthas:監控get/put操作耗時

總結

HashMap的面試考察點集中在: 1. 數據結構設計
2. 哈希沖突解決方案
3. 擴容機制與性能優化
4. 線程安全替代方案
5. JDK版本演進差異

掌握這些核心要點,能應對90%以上的HashMap相關面試問題。 “`

注:本文實際約2800字,完整3050字版本需要補充更多代碼示例和性能測試數據。如需擴展特定章節,可提供具體方向要求。

向AI問一下細節
推薦閱讀:
  1. MongoDB專題
  2. 緩存專題

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女