集合與字串類的擴容機制直接影響效能。本文基於 JDK 1.8 源碼,系統分析三大類別的初始容量、擴容觸發條件、擴容倍率與執行緒安全性差異。
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 也翻倍
newCapacity = (oldCapacity << 1) + 1 (2倍+1)synchronized| 項目 | HashMap | Hashtable |
|---|---|---|
| 繼承體系 | AbstractMap | Dictionary |
| 執行緒安全 | 否 | 是 (synchronized) |
| Null 鍵/值 | 允許 (一個 null key) | 不允許 |
| 初始容量 | 16 | 11 |
| 擴容方式 | 2倍 | 2倍+1 |
| 遍歷方式 | Iterator | Iterator + Enumeration |
| Hash 計算 | 二次擾動 (hash ^ (hash >>> 16)) | 直接用 hashCode() |
newCapacity = oldCapacity + (oldCapacity >> 1) (1.5倍)volatile 保證可見性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;
}
new ArrayList<>(expectedSize)、new HashMap<>(expectedSize)、new StringBuilder(estimatedLength)