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

Java 集合框架效能深度解析:ArrayList、LinkedList、HashMap、TreeMap 選型指南

     編輯:Java 相關知識

Java 集合框架架構總覽

Java 集合框架由三大層次構成:

  • 集合介面 (6個): 定義不同集合類型的契約,是框架基石
  • 抽象類別 (5個): 對介面進行部分實現,可擴展為自訂集合類別
  • 實現類別 (8個): 提供具體實現,供直接使用

Java 集合框架圖

Java 2 簡化集合框架圖

核心介面特性速查

Collection 介面

最基本的集合介面,所有實現類別必須提供兩個標準建構子:無參數 (建立空集合) 與單一 Collection 參數 (複製建立)。

基本操作:

  • 新增:add(Object)、addAll(Collection)
  • 刪除:remove(Object)、removeAll(Collection)
  • 交集:retainAll(Collection)

注意: Collection 不提供 get() 隨機存取方法,因為包含 Set (自行維護內部順序)。檢查元素必須使用迭代器。

List 介面

有序 Collection,可精確控制元素插入位置,支援索引存取 (類似陣列),允許重複元素。除了 iterator(),還提供 listIterator() 返回 ListIterator,支援雙向遍歷與增刪改操作。

ArrayList - 動態陣列實現

  • 優點: size、isEmpty、get、set 為常數時間;隨機存取極快
  • 缺點: add 為攤銷常數時間,大量插入需 O(n);插入/刪除中間元素需移動後續元素
  • 容量機制: 內部陣列自動擴容,可用 ensureCapacity() 預先擴容提升效能
  • 非同步

LinkedList - 雙向鏈結串列實現

  • 優點: 首尾插入/刪除極快,適合堆疊、佇列、雙端佇列
  • 缺點: 隨機存取需遍歷,效能較差
  • 特性: 允許 null 元素,非同步

Set 介面

不允許重複元素的 Collection (任意兩元素 e1.equals(e2)=false),最多一個 null。建構子傳入的 Collection 不得包含重複元素。警告: 可變物件若改變狀態導致 equals 回傳 true,將引發問題。

HashSet - 雜湊表實現 (底層 HashMap)

  • 不保證迭代順序,允許 null
  • 基本操作效能穩定 (O(1)),查詢最快
  • 非同步

LinkedHashSet - 雜湊表 + 雙向鏈結串列

  • 維護插入順序迭代,重新插入不影響順序
  • 查詢快速且可預測順序
  • 非同步

TreeSet - 紅黑樹實現 (底層 TreeMap)

  • 元素自然排序或依 Comparator 排序
  • 基本操作保證 O(log n) 時間
  • 非同步

Map 介面

Key-Value 映射,Key 唯一。不繼承 Collection。提供三種集合視圖:Key 集合、Value 集合、Key-Value 映射集合。

HashMap - 雜湊表實現

  • 允許 null Key/Value,查詢最快 (O(1))
  • 不保證順序,非同步
  • 類似 Hashtable 但非同步且允許 null

TreeMap - 紅黑樹實現

  • Key 自然排序或依 Comparator 排序
  • 查詢 O(log n),非同步

LinkedHashMap - 雜湊表 + 雙向鏈結串列

  • 維護 Key 插入順序,兼具快速查詢
  • 非同步

WeakHashMap - 弱參考 Key

  • Key 不再被正常引用時自動移除條目
  • 適合快取場景,非同步

集合類別效能總結表

| 介面 | 實現類別 | 保持插入順序 | 可重複 | 排序 | 使用建議 | |------|----------|-------------|--------|------|----------| | List | ArrayList | ✓ | ✓ | ✗ | **大量隨機存取**;插入/刪除較慢 (陣列特性) | | List | LinkedList | ✓ | ✓ | ✗ | **頻繁插入/刪除**;隨機存取較慢 (鏈表特性) | | Set | HashSet | ✗ | ✗ | ✗ | **最快查詢**;雜湊實現 | | Set | TreeSet | ✗ | ✗ | ✓ | **需排序**;紅黑樹,預設升序 | | Set | LinkedHashSet | ✓ | ✗ | ✗ | **需插入順序 + 快速查詢** | | Map | HashMap | ✗ | ✗ (Key) | ✗ | **最快查找**;雜湊實現 | | Map | TreeMap | ✗ | ✗ (Key) | ✓ | **Key 需排序**;預設升序 | | Map | LinkedHashMap | ✓ | ✗ (Key) | ✓ | **需插入順序 + 快速查找** |

最佳實踐與選型原則

  1. 堆疊/佇列操作: 考慮 List。大量隨機存取用 ArrayList;頻繁插入刪除用 LinkedList
  2. Map 選型: 快速存取用 HashMap;Key 需排序用 TreeMap;需插入順序兼顧速度用 LinkedHashMap
  3. Set 選型: 最快查詢用 HashSet;需排序用 TreeSet;需插入順序用 LinkedHashSet
  4. 雜湊表 Key: 必須正確重寫 equals() 與 hashCode()
  5. 面向介面編程: 回傳型別宣告為介面 (如 List 而非 ArrayList),便於未來替換實現
  6. 避免過時類別: 勿使用 Vector、Hashtable、Stack
  7. 執行緒安全: 需考慮並發時,使用 ConcurrentMap、CopyOnWriteArrayList、CopyOnWriteArraySet 等

程式碼範例:Collection 基本操作

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.List;

public class AddingGroups {
    public static void main(String[] args) {
        Collection<Integer> collection = new ArrayList<Integer>(Arrays.asList(1, 2, 3, 4, 5));
        Integer[] moreInts = {6, 7, 8, 9, 10};
        collection.addAll(Arrays.asList(moreInts));
        for (Integer i : collection)
            System.out.print(i + ",");
    }
}
// 輸出:1,2,3,4,5,6,7,8,9,10,

展示 Collection 建構子接受 Collection 參數初始化,以及 addAll() 批量新增元素。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved