首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

Java 核心集合擴容機制深度解析:HashMap、ArrayList、StringBuilder 等

     編輯:Java 綜合教學

Java 核心集合擴容機制深度解析:HashMap、ArrayList、StringBuilder 等

集合與字串類的擴容機制直接影響效能。本文基於 JDK 1.8 源碼,系統分析三大類別的初始容量、擴容觸發條件、擴容倍率與執行緒安全性差異。

第一類:Map/Set 體系 (HashMap、HashSet、Hashtable)

HashMap

  • 初始容量:16 (1 << 4),必須為 2 的冪次
  • 最大容量:1 << 30
  • 負載因子:0.75f
  • 擴容觸發:元素數量 > capacity * loadFactor (首次為 12)
  • 擴容倍率:2 倍 (oldCap << 1)
  • 關鍵源碼:
    static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; // 16
    static final int MAXIMUM_CAPACITY = 1 << 30;
    static final float DEFAULT_LOAD_FACTOR = 0.75f;
    
    if ((newCap = oldCap << 1) < MAXIMUM_CAPACITY && oldCap >= DEFAULT_INITIAL_CAPACITY)
        newThr = oldThr << 1; // threshold 也翻倍

HashSet

  • 底層封裝 HashMap,key 存元素、value 固定 PRESENT 物件
  • 初始容量、擴容機制完全同 HashMap

Hashtable

  • 初始容量:11 (非 2 的冪次)
  • 負載因子:0.75f
  • 擴容公式:newCapacity = (oldCapacity << 1) + 1 (2倍+1)
  • 執行緒安全:所有方法 synchronized
  • Key/Value 不可為 null

HashMap vs Hashtable 核心差異

項目HashMapHashtable
繼承體系AbstractMapDictionary
執行緒安全否是 (synchronized)
Null 鍵/值允許 (一個 null key)不允許
初始容量1611
擴容方式2倍2倍+1
遍歷方式IteratorIterator + Enumeration
Hash 計算二次擾動 (hash ^ (hash >>> 16))直接用 hashCode()

第二類:List 體系 (ArrayList、Vector、CopyOnWriteArrayList)

ArrayList

  • 初始容量:10
  • 擴容公式:newCapacity = oldCapacity + (oldCapacity >> 1) (1.5倍)
  • 執行緒安全:否

Vector

  • 初始容量:10
  • 擴容公式:有 capacityIncrement 時加增量,否則 2倍
  • 執行緒安全:是 (方法 synchronized)

CopyOnWriteArrayList

  • 初始容量:0 (空陣列)
  • 擴容機制:無自動擴容,每次寫入建立新陣列,長度 = 舊長度 + 新增元素數
  • 讀寫分離:讀取舊陣列,寫入新陣列,volatile 保證可見性
  • 適用場景:讀多寫少、遍歷頻繁、需無鎖讀取

第三類:字串建構器 (StringBuffer、StringBuilder)

  • 共同父類:AbstractStringBuilder (char[] value)
  • 初始容量:16
  • 擴容邏輯:
    private int newCapacity(int minCapacity) {
        int newCapacity = (value.length << 1) + 2; // 2倍+2
        if (newCapacity - minCapacity < 0)
            newCapacity = minCapacity;
        return (newCapacity < 0) ? Integer.MAX_VALUE : newCapacity;
    }
  • 差異:StringBuffer 同步 (執行緒安全)、StringBuilder 非同步 (效能更好,JDK 1.5+ 推薦)

效能優化建議

  1. 預估容量:new ArrayList<>(expectedSize)、new HashMap<>(expectedSize)、new StringBuilder(estimatedLength)
  2. 避免頻繁擴容:擴容涉及陣列複製 (Arrays.copyOf),大資料量時極其耗時
  3. 選對工具:多執行緒寫入用 ConcurrentHashMap / CopyOnWriteArrayList;單執行緒高頻字串拼接用 StringBuilder
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved