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

Java 集合框架源碼級解析(二):Collection 架構與核心抽象類深度剖析

     編輯:Java 綜合教學

Collection 體系總覽

Collection 為頂層接口,兩大分支:

  • List:有序、可重復、帶索引(隊列語義)
  • Set:無序、不可重復(數學集合語義)
Collection 繼承體系圖

迭代器機制

  • iterator() 返回 Iterator,統一遍歷入口。
  • ListIterator 為 List 專屬,支持雙向遍歷、索引操作、添加修改。

核心接口 API 速查

Collection 接口 (extends Iterable)

boolean add(E e)
boolean addAll(Collection c)
void clear()
boolean contains(Object o)
boolean containsAll(Collection c)
boolean equals(Object o)
int hashCode()
boolean isEmpty()
Iterator iterator()
boolean remove(Object o)
boolean removeAll(Collection c)
boolean retainAll(Collection c)
int size()
Object[] toArray()
 T[] toArray(T[] a)

List 接口 (extends Collection) 新增

void add(int index, E element)
boolean addAll(int index, Collection c)
E get(int index)
int indexOf(Object o)
int lastIndexOf(Object o)
ListIterator listIterator()
ListIterator listIterator(int index)
E remove(int index)
E set(int index, E element)
List subList(int from, int to)

Set 接口

無額外 API,完全繼承 Collection。

抽象骨架類:減輕實現負擔

AbstractCollection

  • 實現除 iterator()、size() 外所有方法。
  • 核心邏輯均委託給 iterator():contains、toArray、remove、containsAll、addAll、removeAll、clear、toString。
  • 子類只需實現 size() 與 iterator() 即可獲得完整功能。

AbstractList

  • extends AbstractCollection, implements List
  • 實現除 size()、get(int) 外所有 List 方法。
  • 提供 Itr (Iterator) 與 ListItr (ListIterator) 內部類,含 modCount 快速失效機制。
  • subList 返回視圖 (SubList/RandomAccessSubList),非拷貝,操作委託原列表並加偏移量。
  • equals/hashCode 按元素順序計算。

AbstractSet

  • extends AbstractCollection, implements Set
  • Set 無額外 API,實現同 AbstractCollection。

迭代器接口詳解

Iterator (基礎)

boolean hasNext()
E next()
void remove()

Fail-fast:遍歷期間集合結構被其他線程修改,拋 ConcurrentModificationException。

ListIterator (List 專屬,extends Iterator)

// 繼承方法
boolean hasNext(); E next(); void remove();
// 新增
void add(E e)
boolean hasPrevious()
E previous()
int nextIndex()
int previousIndex()
void set(E e)

源碼精華片段解讀

AbstractCollection.toArray() 擴容邏輯

Object[] r = new Object[size()];
Iterator it = iterator();
for (int i = 0; i < r.length; i++) {
    if (!it.hasNext()) return Arrays.copyOf(r, i);
    r[i] = it.next();
}
return it.hasNext() ? finishToArray(r, it) : r;

先按 size 分配,不足則 finishToArray 以 1.5 倍擴容。

Itr.next() 雙重語義

public E next() {
    checkForComodification();
    int i = cursor;
    E next = get(i);
    lastRet = i;
    cursor = i + 1; // 1. 索引前移
    return next;    // 2. 返回當前值
}

ListItr.previous() 反向邏輯

public E previous() {
    checkForComodification();
    int i = cursor - 1;
    E previous = get(i);
    lastRet = cursor = i; // 索引後移
    return previous;
}

SubList 視圖模式

public E get(int index) {
    rangeCheck(index);
    checkForComodification();
    return l.get(index + offset); // 委託原列表 + 偏移
}

所有操作映射到原列表對應區間,modCount 同步保證一致性。

實戰啟示

  • 自定義集合繼承 AbstractList/Set 只需實現 1-2 個核心方法。
  • subList 非拷貝,修改視圖影響原列表,反之亦然。
  • 迭代器 modCount 機制要求單線程遍歷,並發場景用 CopyOnWriteArrayList 或加鎖。
  • RandomAccess 標記接口讓 ArrayList 等支持快速隨機訪問,subList 保留該標記。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved