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

Java 集合框架深度解析:核心介面、實現類與最佳實踐

     編輯:Java 相關知識

集合框架概覽

Java 集合框架位於 java.util 套件,提供一套統一的架構來儲存與操作物件群組。它主要包含三大核心部分:

  • 介面:定義抽象資料型別(Collection, List, Set, Map, Queue 等)
  • 實現:具體資料結構(ArrayList, LinkedList, HashSet, HashMap 等)
  • 演算法:靜態工具方法(排序、搜尋、洗牌等,位於 Collections 類)

核心介面體系

Collection (介面)
├── List (有序、可重複)
│   ├── ArrayList (動態陣列)
│   ├── LinkedList (雙向鏈表)
│   └── Vector (同步,已過時)
├── Set (無序、唯一)
│   ├── HashSet (哈希表)
│   ├── LinkedHashSet (保持插入順序)
│   └── TreeSet (紅黑樹,有序)
└── Queue (佇列)
    ├── PriorityQueue (優先佇列)
    └── ArrayDeque (雙端佇列)

Map (介面,鍵值對)
├── HashMap (哈希表)
├── LinkedHashMap (保持插入/存取順序)
├── TreeMap (紅黑樹,鍵有序)
├── Hashtable (同步,已過時)
└── ConcurrentHashMap (高併發)

List 介面詳解

ArrayList:動態陣列

  • 底層:Object[] elementData,預設容量 10,擴容 1.5 倍
  • 優點:隨機存取 O(1),記憶體緊湊,遍歷快
  • 缺點:插入/刪除需位移元素 O(n),非同步
  • 適用:頻繁讀取、尾部新增、隨機存取場景

LinkedList:雙向鏈表

  • 底層:Node 節點,含 prev/next 指標
  • 優點:頭尾插入/刪除 O(1),實作 Deque/Queue
  • 缺點:隨機存取 O(n),記憶體開銷大,遍歷慢
  • 適用:頻繁頭尾操作、佇列/棧、大量插入刪除場景

程式碼範例

// ArrayList 範例
List<Penguin> penguins = new ArrayList<>();
penguins.add(new Penguin("楠楠", "Q仔"));
penguins.add(new Penguin("花花", "Q妹"));

// 遍歷方式
for (Penguin p : penguins) { ... }                    // for-each (推薦)
penguins.forEach(p -> ...);                           // Lambda
Iterator<Penguin> it = penguins.iterator();           // 迭代器 (需刪除時)
while (it.hasNext()) { Penguin p = it.next(); ... }

// LinkedList 特有方法
LinkedList<Penguin> list = new LinkedList<>();
list.addFirst(new Penguin("首領", "Boss"));
list.addLast(new Penguin("小弟", "Minion"));
Penguin first = list.getFirst();
Penguin last = list.getLast();
list.removeFirst();
list.removeLast();

Map 介面詳解

HashMap (JDK 8+)

  • 結構:陣列 + 鏈表 + 紅黑樹 (鏈表長度 ≥ 8 且陣列長度 ≥ 64 轉樹)
  • 鍵:null 允許唯一,值:可重複
  • 非同步,高併發用 ConcurrentHashMap
  • 負載因子 0.75,擴容 2 倍

程式碼範例

Map<String, String> petMap = new HashMap<>();
petMap.put("嘻嘻", "狗狗");
petMap.put("哈哈", "企鵝");

// 查詢
String pet = petMap.get("嘻嘻"); // 狗狗
boolean exists = petMap.containsKey("呵呵"); // false

// 遍歷 (推薦 entrySet)
for (Map.Entry<String, String> entry : petMap.entrySet()) {
    System.out.println(entry.getKey() + " -> " + entry.getValue());
}

// Java 8+ forEach
petMap.forEach((k, v) -> System.out.println(k + " -> " + v));

效能對比與選型指南

操作ArrayListLinkedListHashMapTreeMap
隨機存取O(1) ★O(n)O(1)O(log n)
頭部插入/刪除O(n)O(1) ★--
尾部插入/刪除O(1) ★O(1) ★--
搜尋O(n)O(n)O(1) ★O(log n)
有序遍歷---O(n) ★

最佳實踐

  1. 優先使用介面宣告:List<T> list = new ArrayList<>()
  2. 指定初始容量避免頻繁擴容:new ArrayList<>(expectedSize)
  3. 使用 Collections.unmodifiableList 返回唯讀視圖保護封裝性
  4. 多執行緒環境用 Collections.synchronizedList 或並發集合
  5. 遍歷時需刪除元素,必須使用 Iterator 的 remove() 方法
  6. Map 鍵盡量使用不可變物件 (String, Integer 等),正確實作 equals/hashCode
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved