我知道你通过调用你创建的ArrayList上的iterator()方法得到它,但是这个方法是什么样的?
由于Iterator只是Java中定义的接口,我不确定ArrayList如何传回Iterator的具体实现?
我知道如何为自己的类实现这些...我想知道Java的ArrayList是如何做到的......也许标准库中有一个具体的迭代器类我不会知道吗?
答案 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
希望这会帮助