Java类ArrayList如何返回Iterator对象?

时间:2014-10-03 14:12:07

标签: java arraylist iterator

我知道你通过调用你创建的ArrayList上的iterator()方法得到它,但是这个方法是什么样的?

由于Iterator只是Java中定义的接口,我不确定ArrayList如何传回Iterator的具体实现?

我知道如何为自己的类实现这些...我想知道Java的ArrayList是如何做到的......也许标准库中有一个具体的迭代器类我不会知道吗?

4 个答案:

答案 0 :(得分:3)

你可以自己找到它

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> { ... }

答案 1 :(得分:1)

ArrayList类内部具有Iterator的实现。要么是这样,要么它有一个内部方法,它从另一个类构造Iterator实现。我不确定的原因是因为唯一的方法就是查看源代码,我还没有这样做。拥有接口的关键是您不需要 来了解内部实现。您只知道Iterator接口能够做什么 - 这是由接口规范定义的。

是的,某处Iterator接口的具体实现。 ArrayList类正在使用此类实现中的构造函数,创建对象并将其返回给您。

答案 2 :(得分:0)

迭代器看起来像这样

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

每次都返回一个新的迭代器。
请注意,您应该在代码中执行类似的操作,以便最终无限循环

Iterator iterator = myCollections.iterator();

使用此迭代器对象循环遍历您的集合。 如果你这样做

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

只是始终打印第一个对象,这将是一个无限循环。


编辑:


要回答你的问题,它来自AbstractList,它有一个具体的实现。

答案 3 :(得分:0)

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 Source code

希望这会帮助