Collection 為頂層接口,兩大分支:
iterator() 返回 Iterator,統一遍歷入口。ListIterator 為 List 專屬,支持雙向遍歷、索引操作、添加修改。boolean add(E e)
boolean addAll(Collection extends E> 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)
void add(int index, E element)
boolean addAll(int index, Collection extends E> 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)
無額外 API,完全繼承 Collection。
iterator()、size() 外所有方法。iterator():contains、toArray、remove、containsAll、addAll、removeAll、clear、toString。size() 與 iterator() 即可獲得完整功能。size()、get(int) 外所有 List 方法。Itr (Iterator) 與 ListItr (ListIterator) 內部類,含 modCount 快速失效機制。subList 返回視圖 (SubList/RandomAccessSubList),非拷貝,操作委託原列表並加偏移量。equals/hashCode 按元素順序計算。boolean hasNext()
E next()
void remove()
Fail-fast:遍歷期間集合結構被其他線程修改,拋 ConcurrentModificationException。
// 繼承方法
boolean hasNext(); E next(); void remove();
// 新增
void add(E e)
boolean hasPrevious()
E previous()
int nextIndex()
int previousIndex()
void set(E e)
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 倍擴容。
public E next() {
checkForComodification();
int i = cursor;
E next = get(i);
lastRet = i;
cursor = i + 1; // 1. 索引前移
return next; // 2. 返回當前值
}
public E previous() {
checkForComodification();
int i = cursor - 1;
E previous = get(i);
lastRet = cursor = i; // 索引後移
return previous;
}
public E get(int index) {
rangeCheck(index);
checkForComodification();
return l.get(index + offset); // 委託原列表 + 偏移
}
所有操作映射到原列表對應區間,modCount 同步保證一致性。
AbstractList/Set 只需實現 1-2 個核心方法。subList 非拷貝,修改視圖影響原列表,反之亦然。modCount 機制要求單線程遍歷,並發場景用 CopyOnWriteArrayList 或加鎖。RandomAccess 標記接口讓 ArrayList 等支持快速隨機訪問,subList 保留該標記。