繁体   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