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

J2SE 集合框架全景圖:從 Collection 到 Map 的核心架構與實戰代碼

     編輯:Java 相關知識

Java 集合框架以 Collection、Map 為雙核心,統一了資料結構操作介面。本文梳理介面繼承體系、核心實現類 (ArrayList/LinkedList/HashSet/HashMap) 關鍵方法原始碼邏輯、迭代器模式、泛型用法,附完整可運行示例代碼。

一、介面繼承體系

Iterable (根)
 └─ Collection
      ├─ List (有序、可重複) → ArrayList, LinkedList, Vector, Stack
      ├─ Set (無序、不可重複) → HashSet, LinkedHashSet, TreeSet
      └─ Queue (佇列) → PriorityQueue, ArrayDeque, LinkedList
Map (獨立介面,鍵值映射) → HashMap, LinkedHashMap, TreeMap, Hashtable, ConcurrentHashMap
  • Collection 繼承 Iterable → 統一支援 for-each 與 iterator()
  • AbstractCollection 提供骨架實現,減少子類開發量

二、List 兩大主力原始碼級剖析

ArrayList (動態陣列)

  • add(E):末尾添加,滿時擴容 1.5倍+1,Arrays.copyOf
  • add(index, E):System.arraycopy 後移元素,插入
  • remove(index):後移元素覆蓋,末尾置 null
  • get/set(index):陣列下標直達,**O(1) 極快**

LinkedList (雙向鏈表)

  • 內部類 Node<E> { E item; Node<E> next, prev; }
  • add(E):尾節點前插入,修改 4 個指標,**O(1)**
  • add(index, E):先遍歷定位 (二分優化:從頭/尾較近端起步),再改指標
  • remove(index):定位後斷開指標,**無搬移**
  • get/set(index):需遍歷,**O(N)**

結論:大量隨機存取 → ArrayList;頻繁中間增刪 → LinkedList。

三、Set 與查找優化

  • HashSet:底層 HashMap,add/contains/remove 平均 **O(1)**,首選
  • TreeSet:紅黑樹,**有序**,O(log N)
  • LinkedHashSet:雜湊 + 鏈表,**保持插入順序**

四、迭代器設計模式

Iterator 為輕量級物件,統一遍歷介面,支援 remove() 安全刪除。

五、Map 鍵值映射核心操作

  • put(K, V) / get(K):雜湊定位桶位,鏈表/樹中比對 equals()
  • keySet() / values() / entrySet():三種視圖遍歷
  • HashMap:無序、高效;TreeMap:有序;LinkedHashMap:插入/存取序

六、完整示例代碼

List + Iterator 實戰


import java.util.*;

public class ListDemo {
    public static void main(String[] args) {
        Collection<Integer> col = new ArrayList<>(Arrays.asList(10,20,30));
        List<Integer> list = new LinkedList<>();
        list.addAll(col);
        list.add(40); list.add(50); list.add(60);

        // Iterator 單向遍歷 + 安全刪除
        Iterator<Integer> it = list.iterator();
        while (it.hasNext()) {
            Integer v = it.next();
            System.out.print(v + " ");
            if (v == 50) it.remove(); // 安全刪除
        }
        System.out.println();

        // ListIterator 雙向遍歷
        ListIterator<Integer> li = list.listIterator();
        while (li.hasNext()) System.out.print(li.next() + " "); // 正向
        System.out.println();
        while (li.hasPrevious()) System.out.print(li.previous() + " "); // 反向
    }
}

Map 實戰


import java.util.*;

public class MapDemo {
    public static void main(String[] args) {
        Map<String,Integer> hm = new HashMap<>();
        hm.put("a1",1); hm.put("b2",2); hm.put("c3",3); hm.put("d4",4); hm.put("e5",5);

        // 遍歷 entrySet (最高效)
        for (Map.Entry<String,Integer> e : hm.entrySet()) {
            System.out.println(e.getKey() + " : " + e.getValue());
        }
        System.out.println("Contains c3: " + hm.containsKey("c3"));
        hm.remove("c3");
        System.out.println("Contains value 3: " + hm.containsValue(3));
        System.out.println("Size: " + hm.size());
    }
}

七、最佳實踐提醒

  • 介面宣告,實現注入:List<T> list = new ArrayList<>(); 而非 ArrayList<T> list = ...
  • 泛型完整參數化:避免原始型別警告
  • 預估初始容量:new ArrayList(1000) 減少擴容
  • 善用 Collections 工具:sort, binarySearch, unmodifiableList, synchronizedMap 等
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
介面適用範圍關鍵方法
Iterator所有 CollectionhasNext(), next(), remove()
ListIterator僅 List+ hasPrevious(), previous(), add(), set()