簡體   English   中英

Java類ArrayList如何返回迭代器對象?

[英]How does the Java class ArrayList return an Iterator Object?

我知道您可以通過在創建的ArrayList上調用iterator()方法來獲得它,但是該方法是什么樣的?

由於Iterator只是用Java定義的接口,因此我不確定ArrayList如何傳遞回Iterator的具體實現嗎?

我知道如何為自己的類自己實現這些...我想知道Java的ArrayList是如何實現的...也許我不知道的標准庫中有具體的Iterator類?

你自己就能找到

System.out.println(new ArrayList().iterator().getClass());

我可能也得到class java.util.ArrayList$Itr $符號表示內部類(是否靜態)。 如果我們進入源代碼,我們將看到

public Iterator<E> iterator() {
    return new Itr();
}

然后在這個文件中

private class Itr implements Iterator<E> { ... }

ArrayList類在內部具有Iterator的實現。 要么,要么它具有一個內部方法,該方法從另一個類構造一個Iterator實現。 我不確定的原因是因為唯一的了解方法就是瀏覽源代碼,而我還沒有做過。 擁有接口的關鍵是您不需要了解內部實現。 您只知道Iterator接口的功能-接口規范定義了該接口。

是的,在某處Iterator接口的具體實現。 ArrayList類使用此類實現中的構造函數,創建對象並將其返回給您。

迭代器看起來像這樣

Iterator<T> iterator() {
  return new Iterator<T>(this);
}

每次返回一個新的迭代器。
注意,您應該在代碼中執行類似的操作,以免最終陷入無窮的for循環

Iterator iterator = myCollections.iterator();

使用此迭代器對象可以遍歷您的集合。 如果你這樣做

while(myCollections.iterator().hasNext) {
   System.out.println(myCollections.iterator().next());
}

只打印第一個對象將是一個無休止的循環。


編輯:


為了回答您的問題,它來自AbstractList ,它具有具體的實現。

ArrayList在內部將迭代器實現為嵌套類。

private class Itr implements Iterator<E> {
    int cursor;       // index of next element to return
    int lastRet = -1; // index of last element returned; -1 if no such
    int expectedModCount = modCount;

    public boolean hasNext() {
       return cursor != size;
   }

然后通過iterator()方法返回它的對象

 public Iterator<E> iterator() {
    return new Itr();
 }

您可以參考源代碼以更好地理解ArrayList源代碼

希望這會有所幫助

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM