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

Java 集合框架核心對比:ArrayList vs Vector、HashMap vs Hashtable 深度解析

     編輯:Java 相關知識

前言

這是 Java 面試高頻題,也是日常開發選型的關鍵。本文從線程安全、擴容機制、歷史淵源、性能特點四個維度深度對比,並給出現代開發選型建議。

一、ArrayList vs Vector

核心差異對比表

維度ArrayListVector
線程安全非線程安全線程安全(方法級 synchronized)
擴容倍數1.5 倍2 倍(默認雙倍)
性能高(無鎖開銷)低(同步開銷)
推出版本JDK 1.2JDK 1.0(古老集合)
繼承體系List → AbstractListList → AbstractList

源碼級擴容對比


// ArrayList (JDK 17)
private void grow(int minCapacity) {
    int oldCapacity = elementData.length;
    int newCapacity = oldCapacity + (oldCapacity >> 1); // 1.5 倍
    elementData = Arrays.copyOf(elementData, newCapacity);
}

// Vector
public synchronized void ensureCapacityHelper(int minCapacity) {
    if (minCapacity > elementData.length) {
        int newCapacity = (capacityIncrement > 0) ? 
            elementData.length + capacityIncrement : 
            elementData.length * 2; // 默認 2 倍
        elementData = Arrays.copyOf(elementData, newCapacity);
    }
}

現代開發建議

  • 首選 ArrayList:單線程環境、或外部同步、或併發量低
  • 避免 Vector:鎖粒度粗(方法級),性能差,API 設計陳舊
  • 多線程替代方案:
    • Collections.synchronizedList(new ArrayList<>()):鎖粒度同 Vector
    • CopyOnWriteArrayList:讀多寫少、遍歷不加鎖、弱一致性
    • List<T> list = new ArrayList<>(); + 手動 synchronized/ReentrantLock:精細控制鎖範圍

二、HashMap vs Hashtable

核心差異對比表

維度HashMapHashtable
線程安全非線程安全線程安全(方法級 synchronized)
Null 鍵/值允許 1 個 null key、多個 null value不允許 null key/value(拋 NPE)
初始容量16(默認)11(默認)
擴容方式2 的冪次(2倍)2n+1(約 2 倍+1)
哈希計算擾動函數 + (n-1)&hash直接 key.hashCode()
繼承體系Map → AbstractMapMap → Dictionary(舊)
推出版本JDK 1.2JDK 1.0

關鍵源碼差異


// HashMap putVal 允許 null key
if (key == null) {
    return putForNullKey(value); // 存放在 table[0]
}

// Hashtable put 直接拋異常
if (value == null) {
    throw new NullPointerException();
}

現代開發建議

  • 首選 HashMap:單線程、高性能場景
  • 避免 Hashtable:同 Vector,鎖粒度粗、API 陳舊
  • 多線程替代方案:
    • ConcurrentHashMap(首選):JDK 8 采用 CAS + synchronized(節點級),分段鎖 → 節點鎖,高併發性能極佳
    • Collections.synchronizedMap(new HashMap<>()):全鎖,性能同 Hashtable
  • 特殊需求:
    • 保持插入順序:LinkedHashMap
    • 按鍵排序:TreeMap
    • 弱引用鍵:WeakHashMap
    • 枚舉鍵:EnumMap(極致性能)

三、集合繼承體系全景圖


Collection
├── List
│   ├── ArrayList
│   ├── LinkedList
│   ├── Vector
│   │   └── Stack
│   └── CopyOnWriteArrayList
└── Set
    ├── HashSet
    ├── LinkedHashSet
    ├── TreeSet
    └── CopyOnWriteArraySet

Map
├── HashMap
├── LinkedHashMap
├── TreeMap
├── WeakHashMap
├── IdentityHashMap
├── EnumMap
├── Hashtable
│   └── Properties
└── ConcurrentHashMap
    └── ConcurrentSkipListMap

四、選型決策樹


需要 List?
├── 單線程/外部同步 → ArrayList
├── 多線程、讀多寫少 → CopyOnWriteArrayList
├── 多線程、寫多、需強一致性 → ArrayList + 手動鎖 / Collections.synchronizedList
└── 作為棧/隊列 → ArrayDeque (首選) / LinkedList

需要 Map?
├── 單線程 → HashMap
├── 多線程 → ConcurrentHashMap
├── 需保持插入順序 → LinkedHashMap
├── 需按鍵排序 → TreeMap
├── 鍵為枚舉 → EnumMap
└── 鍵需弱引用 → WeakHashMap

五、性能基準參考(百萬級數據)

| 操作 | ArrayList | Vector | HashMap | Hashtable | ConcurrentHashMap | |------|-----------|--------|---------|-----------|-------------------| | 單線程寫入 | 基準 | ~3-5x 慢 | 基準 | ~3-5x 慢 | ~1.2-1.5x 慢 | | 多線程讀取 | 不安全 | 慢 | 不安全 | 慢 | **最快** | | 多線程寫入 | 不安全 | 極慢 | 不安全 | 極慢 | **最快** |

總結

現代 Java 開發原則:

  1. 默認使用 ArrayList、HashMap
  2. 多線程環境首選 ConcurrentHashMap、CopyOnWriteArrayList
  3. 棄用 Vector、Hashtable、Stack(Stack 官方建議用 Deque/ArrayDeque)
  4. 理解底層原理(擴容、哈希、鎖機制)才能做正確選型
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved