迭代器保证有以下方法:
当for-each
循环遍历iterable
类对象时,它如何知道开始的对象是什么?上述方法提供了明确的前进路径,但是什么指向起始元素?
For-each
保证遍历所有相关对象。根据类及其next()
实现,从哪里开始(考虑forward linked list
或具有root
元素的任何其他实现)可能非常重要。
它是如何运作的?
如果我的问题没有意义,请解释原因。
答案 0 :(得分:2)
您可能希望查看ArrayList
Iterator
内部类Itr
的实现。
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;
}
@SuppressWarnings("unchecked")
public E next() {
checkForComodification();
int i = cursor;
if (i >= size)
throw new NoSuchElementException();
Object[] elementData = ArrayList.this.elementData;
if (i >= elementData.length)
throw new ConcurrentModificationException();
cursor = i + 1;
return (E) elementData[lastRet = i];
}
...
}
默认情况下, cursor
会初始化为0
。您使用cursor
来访问ArrayList
对象的后备数组中的元素(它是一个内部类,它可以访问该字段)。
类似的逻辑适用于Iterator
的其他实现。它总是取决于底层数据结构。作为另一个例子,Set
不应该有排序,但它确实实现了Iterator
。必须决定迭代器的起始位置。
答案 1 :(得分:2)
正式称为增强型for
语句(for(E e: Iterable<E> iterable)
)的内容由编译器翻译成以下代码的等效内容:
E e;
for(Iterator<E> it = iterable.iterator(); it.hasNext(); ) {
e = it.next();
// contents of your for loop
}
循环的行为就像你用明确的Iterator
写的一样,所以&#34;起点&#34;增强的for
循环是iterable.iterator()
无论如何都要开始的地方。
答案 2 :(得分:0)
foreach是for循环从第一个到最后一个的简写。
答案 3 :(得分:0)
这一切都取决于你的收藏。
如果您的集合是一个列表(通常为ArrayList
或LinkedList
),那么迭代器将按照列表顺序排列。
如果是地图或集合,则很难预测其成员的顺序。如果您使用的是地图或集合,实际上您不应指望任何类型的可预测排序,因为它与这些集合的目的不匹配。但是,如果您需要特定订单但需要Map或Set的功能,则可以使用LinkedHashMap
或LinkedHashSet
。