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

Java 集合框架全景解析:核心架構與設計哲學

     編輯:Java 綜合教學

Java 集合框架概覽

Java 提供了一個極為豐富的集合框架,涵蓋大量介面、抽象類別與具體實作類別。這些介面與類別協同工作,能滿足絕大多數資料聚合需求。下圖展示了整個框架的宏觀結構:

圖中左側為介面層,右側為實作類別,中間連線表示實作關係。例如 AbstractList 實作了 List 介面,其子類別自動繼承該介面。若類別實作某介面,則同時實作該介面所有父介面(如 TreeSet 實作 Deque,即同時實作 Queue、Collection、Iterable)。紅色標記為抽象類別(多以 Abstract 開頭),綠色為早期版本遺留類別(如 Vector、Hashtable)。

介面與實作分離:以 Queue 為例

Java 集合類別庫嚴格區分介面與實作。以佇列(Queue)為例,介面定義核心行為:尾部新增、頭部移除、查詢大小,語意為先進先出(FIFO)。介面設計可能如下:

interface Queue<E> {
    void add(E element);
    E remove();
    int size();
}

介面不規定內部實作細節。常見實作有循環陣列與鏈結串列兩種:

class CircularArrayQueue<E> implements Queue<E> {
    CircularArrayQueue(int capacity) { ... }
    public void add(E element) { ... }
    public E remove() { ... }
    private E[] elements;
    private int head, tail;
}

class LinkedListQueue<E> implements Queue<E> {
    LinkedListQueue() { ... }
    public void add(E element) { ... }
    public E remove() { ... }
    public int size() { ... }
    private Link head, tail;
}

實際開發中直接使用 LinkedList(實作 Queue)。建構集合物件時才指定具體類別,其餘程式碼皆面向介面:

Queue<Employee> q = new CircularArrayQueue<>(100);
q.add(new Employee("Harry"));

若需切換實作,僅需修改建構子呼叫處:

Queue<Employee> q = new LinkedListQueue<>();
q.add(new Employee("Harry"));

這體現了「面向介面程式設計」精髓:實作細節封裝於具體類別,使用者依據效能特性(如隨機存取、插入刪除效率)自行權衡選擇。框架中大量 Abstract* 抽象類別為實作者提供基礎方法實作,若要自訂佇列,繼承 AbstractQueue 比直接實作 Queue 更便捷。

核心介面與迭代器機制

Collection 是集合體系根介面,定義基礎操作:

boolean add(E element);
Iterator<E> iterator();

add 成功改變集合回傳 true,iterator 回傳實作 Iterator 的物件,用於順序存取元素。Iterator 三大核心方法:

public interface Iterator<E> {
    E next();
    boolean hasNext();
    void remove();
}

遍歷模式:

Collection<String> c = ...;
Iterator<String> it = c.iterator();
while (it.hasNext()) {
    String element = it.next();
    // 處理 element
}

Java SE 5.0 引入增強型 for 迴圈,編譯器自動轉換為迭代器模式:

for (String element : c) {
    // 處理 element
}

此語法適用於所有實作 Iterable 的物件(Collection 繼承 Iterable)。

迭代器的位置模型與 remove 行為

Java 迭代器概念上位於元素之間(如游標),next() 跨越下一元素並回傳該元素引用,位置隨之右移。remove() 刪除上次 next() 回傳的元素,故必須緊跟 next() 呼叫,否則拋出 IllegalStateException。連續刪除需交替呼叫 next():

it.next(); it.remove(); // 正確刪除第一個元素
it.next(); it.remove(); // 正確刪除下一個元素

集合類型決定遍歷順序:ArrayList 依索引遞增,HashSet 則為無序(雖能保證遍歷所有元素)。

Collection 介面完整契約

Collection 介面方法眾多,涵蓋增刪查、批次操作、轉陣列、串流支援等:

public interface java.util.Collection<E> extends java.lang.Iterable<E> {
    int size(); boolean isEmpty(); boolean contains(Object o);
    Iterator<E> iterator(); Object[] toArray(); <T> T[] toArray(T[] a);
    boolean add(E e); boolean remove(Object o); boolean containsAll(Collection<?> c);
    boolean addAll(Collection<? extends E> c); boolean removeAll(Collection<?> c);
    boolean retainAll(Collection<?> c); void clear(); boolean equals(Object o);
    int hashCode(); Spliterator<E> spliterator(); Stream<E> stream(); Stream<E> parallelStream();
    boolean removeIf(Predicate<? super E> filter);
}

為減輕實作者負擔,AbstractCollection 提供預設實作(如 isEmpty、contains),具體類別可繼承並選覆寫。

集合框架介面全景

Collection 與 Map 為兩大核心介面,所有集合類別實作其中之一。Iterator、ListIterator(提供雙向遍歷與修改)為迭代器介面。RandomAccess 為標記介面,用於檢測是否支援高效隨機存取(如 ArrayList 實作)。

常用具體實作類別一覽

紅色為抽象類別,分為 Collection 體系與 Map 體系。14 個核心實作類別特性摘要:

Java 庫中的具體集合
集合類型描述
ArrayList動態增長縮減的索引序列
LinkedList任意位置高效插入刪除的有序序列
ArrayDeque循環陣列實作的雙端佇列
HashSet無重複元素的無序集合
TreeSet有序集合
EnumSet列舉型別值集合
LinkedHashSet記住插入順序的集合
PriorityQueue高效刪除最小元素的佇列
HashMap鍵值關聯資料結構
TreeMap鍵值有序排列的映射表
EnumMap鍵為列舉型別的映射表
LinkedHashMap記住鍵值項添加次序的映射表
WeakHashMap值無用時可被 GC 回收的映射表
IdentityHashMap使用 == 而非 equals 比較鍵的映射表

關於有序性、元素可重複性總結(Map 考察鍵):

後續系列主題

  • Java集合(二):List 列表
  • Java集合(三):Set 集合
  • Java集合(四):Queue 佇列
  • Java集合(五):專用 Set 與專用 Map
  • Java集合(六):Java 集合框架深度解析
  • Java集合(七):集合演算法與遺留類別
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved