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

Java集合框架根接口Collection與Iterator深度解析

     編輯:Java 相關知識

前言:集合體系的基石

Java集合框架(JCF)以Collection<E>為根接口,統一了「對象組」的操作契約。所有集合實現類(直接或間接)實現此接口,並繼承Iterable<E>,賦予統一遍歷能力。本文深度剖析Collection接口契約、Iterator設計精髓、實現類構造約定及equals/hashCode語義。

一、 Collection接口核心契約


public interface Collection<E> extends Iterable<E> {
    // 查詢操作
    int size();
    boolean isEmpty();
    boolean contains(Object o);
    Iterator<E> iterator();
    Object[] toArray();
    <T> T[] toArray(T[] a);

    // 修改操作(可選,不可修改集合拋UnsupportedOperationException)
    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();

    // 流式操作(Java 8+)
    default Stream<E> stream() { ... }
    default Stream<E> parallelStream() { ... }
}

關鍵語義規範

  1. 構造器約定(非強制,但所有JDK實現遵守):
    ① 無參構造器 → 空集合
    ② Collection(Collection<? extends E> c) → 複製構造器,創建等效集合
  2. 「破壞性」方法:修改集合內容的方法,若實現類不支持(如Collections.unmodifiableList),必須拋UnsupportedOperationException
  3. 元素限制:實現類可限制null、類型,違規拋NullPointerException/ClassCastException
  4. equals契約:contains(o)語義為o==null ? e==null : o.equals(e)。實現可優化(先比hashCode),但不可違背語義

二、 Iterator接口:統一遍歷抽象


public interface Iterator<E> {
    boolean hasNext();
    E next();
    default void remove() { throw new UnsupportedOperationException(); }
    default void forEachRemaining(Consumer<? super E> action) { ... }
}

優於Enumeration的兩大改進

  1. 安全刪除:remove()在遍歷中刪除最近返回的元素,避免ConcurrentModificationException
  2. 方法命名規範:hasNext/next替代hasMoreElements/nextElement,更簡潔

ListIterator增強

專為List設計,雙向遍歷(hasPrevious/previous)、索引獲取(nextIndex/previousIndex)、插入(add)、修改(set),是List專屬的強力游標。

三、 核心子接口體系

Collection
├── List          // 有序、可重複、索引訪問
│   ├── ArrayList
│   ├── LinkedList
│   └── Vector (legacy)
├── Set           // 無序、唯一
│   ├── HashSet
│   ├── LinkedHashSet
│   └── TreeSet (SortedSet)
└── Queue         // 佇列語義
    ├── PriorityQueue
    ├── ArrayDeque (Deque)
    └── LinkedList (Deque)

注意:Map不繼承Collection,但提供values()(Collection)、keySet()(Set)、entrySet()(Set<Map.Entry>)橋接。

四、 實現類構造器最佳實踐


// 良好實現:複製構造器保持類型特性
public class MyArrayList<E> extends ArrayList<E> {
    public MyArrayList() { super(); }
    public MyArrayList(Collection<? extends E> c) { super(c); } // 關鍵!
    public MyArrayList(int capacity) { super(capacity); }
}

// 使用:類型安全複製
List<String> src = new MyArrayList<>(List.of("a", "b"));
List<String> copy = new ArrayList<>(src); // 類型擦除後仍安全

五、 併發環境下的遍歷陷阱與對策

場景問題解決方案
單線程遍歷中修改fail-fast → ConcurrentModificationException用Iterator.remove()或收集待刪元素後批量刪除
多線程並發遍歷數據競爭、拋異常、死循環① CopyOnWriteArrayList(讀多寫少)
② ConcurrentHashMap鍵值視圖(弱一致性迭代器)
③ 加鎖遍歷(性能差)
④ 並行流parallelStream()(無副作用操作)

六、 Java 8+ 流式API與集合協作


// 集合 → Stream → 聚合/轉換 → 收集回集合
List<String> result = collection.stream()
    .filter(s -> s.length() > 3)
    .map(String::toUpperCase)
    .distinct()
    .sorted()
    .collect(Collectors.toList()); // 或 toSet(), toCollection(TreeSet::new)

stream()默認串行、parallelStream()並行(ForkJoinPool.commonPool())。注意:流操作不修改源集合,無副作用函數式風格。

七、 總結

Collection與Iterator構成JCF的「雙子星」:前者定義容器契約,後者提供統一遍歷抽象。掌握其語義規範(構造器、equals、可選操作、fail-fast)、子接口分工、併發遍歷策略、流式轉換模式,是寫出正確、高效、可維護集合代碼的前提。下一步建議深入List/Set/Queue子接口契約、Map體系、併發集合、Stream API進階。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved