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

Java 集合框架核心:Iterable 與 Iterator 差異深度解析

     編輯:Java 相關知識

Iterable 與 Iterator:設計哲學與實作差異

在 Java 集合框架中,Iterable 與 Iterator 是遍歷機制的核心雙支柱。雖然名稱相似,但它們的設計目的、使用場景與內部機制有本質區別。本文從源碼層面深度剖析兩者差異。

核心定義對比

特性IterableIterator
套件位置java.langjava.util
核心方法iterator() 返回新 IteratorhasNext(), next(), remove()
狀態保持無狀態,每次調用返回全新迭代器有狀態,維護當前遍歷位置指標
實作關係Collection 繼承 Iterable集合內部類實作 Iterator

為什麼 Collection 實作 Iterable 而非直接實作 Iterator?

這是關鍵設計決策:

  1. 狀態隔離:Iterator 內部維護游標位置。若 Collection 直接實作 Iterator,集合對象本身將攜帶遍歷狀態,導致多線程或巢狀遍歷時狀態衝突。
  2. 多重並發遍歷:每次呼叫 iterable.iterator() 都獲得獨立迭代器,互不干擾。支援同時對同一集合進行多次獨立遍歷。
  3. 重置機制:無需額外 reset() 方法,自然獲得「從頭開始」的新迭代器。

原始碼層面驗證

// ArrayList 實作 Iterable
public class ArrayList<E> extends AbstractList<E> implements List<E>, RandomAccess, Cloneable, Serializable {
    // 實作 Iterable 唯一方法
    public Iterator<E> iterator() {
        return new Itr(); // 返回內部類新實例
    }
    
    // 內部類實作 Iterator,維護 cursor 狀態
    private class Itr implements Iterator<E> {
        int cursor = 0;
        int lastRet = -1;
        // hasNext(), next(), remove() 依賴 cursor 狀態
    }
}

增強型 for 循環的編譯轉換

語法糖 for (E e : collection) 編譯為:

for (Iterator<E> it = collection.iterator(); it.hasNext(); ) {
    E e = it.next();
    // 循環體
}

這證明增強型 for 依賴 Iterable.iterator() 而非直接依賴 Iterator。

實戰最佳實踐

  • 自定義集合類只需實作 Iterable<T>,提供 iterator() 即可支援增強型 for
  • 需手動控制遍歷流程(如跳過、回退)時直接使用 Iterator
  • 遍歷過程中移除元素必須使用 iterator.remove(),否則拋出 ConcurrentModificationException

總結

Iterable 是「可迭代」的語義契約,提供迭代器工廠方法;Iterator 是具體的「迭代器」實例,攜帶遍歷狀態。這種工廠模式設計保證了遍歷的線程安全性與多重並發能力,是 Java 集合框架優雅設計的典範。

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