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

Java 集合框架全解析:List、Set、Map 核心實現與最佳實踐

     編輯:Java 綜合教學

Java 集合框架全解析:List、Set、Map 核心實現與最佳實踐

集合框架是 Java 開發中處理資料群組的基石。本文系統梳理 Collection 體系架構,深入解析 List(ArrayList、LinkedList、Vector、Stack)、Set(HashSet、TreeSet、LinkedHashSet)、Map(HashMap、Hashtable、WeakHashMap)的核心原理、適用場景與典型代碼範例,助你精準選型、高效開發。

1. 集合框架總覽

所有集合類位於 java.util 套件。集合儲存的是物件引用而非物件本身。主要介面關係:

Collection
├── List (有序、可重複)
│   ├── ArrayList
│   ├── LinkedList
│   ├── Vector
│   │   └── Stack
└── Set (無序、不可重複)
    ├── HashSet
    ├── TreeSet
    └── LinkedHashSet

Map (鍵值對、Key 不重複)
├── HashMap
├── Hashtable
└── WeakHashMap

2. List 介面與實現

2.1 ArrayList - 動態陣列

  • 底層:可調整大小的陣列,隨機存取 O(1),插入/刪除 O(n)。
  • 非同步,效能優於 Vector。
  • 適用:頻繁讀取、較少增刪的場景。
List<String> list = new ArrayList<>();
list.add("A"); list.add("B");
list.remove(0); // 移除索引 0
for (String s : list) System.out.println(s);

2.2 LinkedList - 雙向鏈表

  • 底層:雙向鏈表,首尾增刪 O(1),隨機存取 O(n)。
  • 實現 Deque,可作堆疊、佇列使用。
  • 適用:頻繁頭尾增刪、佇列/堆疊場景。
LinkedList<String> dll = new LinkedList<>();
dll.addFirst("First"); dll.addLast("Last");
System.out.println(dll.getFirst()); // First
System.out.println(dll.getLast());  // Last

2.3 Vector - 同步動態陣列

  • 方法皆 synchronized,執行緒安全但效能較差。
  • 可指定初始容量與增量。
  • 現多被 Collections.synchronizedList 或 CopyOnWriteArrayList 取代。

2.4 Stack - 後進先出堆疊

  • 繼承 Vector,提供 push/pop/peek/empty/search。
  • 建議改用 ArrayDeque(非同步、效能更好)。
Stack<Integer> st = new Stack<>();
st.push(1); st.push(2);
System.out.println(st.pop()); // 2

3. Set 介面與實現

3.1 HashSet - 雜湊集合

  • 底層 HashMap,依 hashCode() 與 equals() 判重,存取 O(1)。
  • 元素無序,不可重複。
  • 自定義物件必須正確重寫 hashCode() 與 equals()。
class Student {
    int id;
    @Override public int hashCode() { return id; }
    @Override public boolean equals(Object o) {
        return o instanceof Student && ((Student)o).id == this.id;
    }
}
Set<Student> set = new HashSet<>();
set.add(new Student(1));
set.add(new Student(1)); // 不會重複加入

3.2 TreeSet - 有序集合

  • 底層紅黑樹,元素按自然順序(實作 Comparable)或自訂 Comparator 排序。
  • 插入/查詢 O(log n)。
class Student implements Comparable<Student> {
    int id;
    public int compareTo(Student o) { return this.id - o.id; }
}
Set<Student> ts = new TreeSet<>();
ts.add(new Student(5)); ts.add(new Student(1));
// 迭代輸出:1, 5

3.3 LinkedHashSet - 保持插入順序

  • 結合 HashSet 查詢速度與雙向鏈表維護插入順序。
  • 迭代順序即新增順序。

4. Map 介面與實現

4.1 HashMap - 主流鍵值對

  • JDK 8 起:陣列 + 鏈表 + 紅黑樹,非同步,允許 null Key/Value。
  • 預設容量 16,負載因子 0.75,擴容 2 倍。
Map<String, String> map = new HashMap<>();
map.put("Zara", "8"); map.put("Mahnaz", "31");
for (Map.Entry<String, String> e : map.entrySet())
    System.out.println(e.getKey() + "=" + e.getValue());

4.2 Hashtable - 同步舊版 Map

  • 所有方法 synchronized,不允許 null Key/Value。
  • 現建議用 ConcurrentHashMap 取代。

4.3 WeakHashMap - 弱引用鍵值對

  • Key 為弱引用,GC 時若 Key 無強引用則自動移除條目。
  • 適合簡易快取,避免記憶體洩漏。
Map<Integer, byte[]> cache = new WeakHashMap<>();
for (int i = 0; i < 10000; i++)
    cache.put(i, new byte[i]); // 記憶體不足時自動清理

5. 遍歷集合的通用方式

// Iterator 遍歷
Iterator<E> it = collection.iterator();
while (it.hasNext()) { E e = it.next(); }

// 增強 for 迴圈
for (E e : collection) { ... }

// ListIterator (僅 List) 支援雙向、增刪
ListIterator<E> lit = list.listIterator();

6. 選型速查表

需求推薦實現備註
高效隨機存取、少增刪ArrayList預設首選
頻繁頭尾增刪、佇列/堆疊LinkedList / ArrayDequeArrayDeque 非同步更快
執行緒安全 ListCopyOnWriteArrayList讀多寫少
去重、無序HashSet需正確實作 hashCode/equals
去重、自動排序TreeSet元素需可比較
去重、保持插入序LinkedHashSet
鍵值對、高效查找HashMap預設首選
執行緒安全 MapConcurrentHashMap高並發首選
自動清理快取WeakHashMapKey 為弱引用

總結

理解各集合底層資料結構、執行緒安全性、效能特徵,才能在實際專案中做出最佳選擇。日常開發以 ArrayList、HashMap、HashSet 為主力,特殊場景再引入 ConcurrentHashMap、TreeSet、WeakHashMap 等進階實現。

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