for-each循环如何知道从哪里开始?

时间:2013-09-24 22:48:18

标签: java foreach iterator

迭代器保证有以下方法:

  • hasNext()
  • 下()
  • 删除(可选

for-each循环遍历iterable类对象时,它如何知道开始的对象是什么?上述方法提供了明确的前进路径,但是什么指向起始元素?

For-each保证遍历所有相关对象。根据类及其next()实现,从哪里开始(考虑forward linked list或具有root元素的任何其他实现)可能非常重要。

它是如何运作的?

如果我的问题没有意义,请解释原因。

4 个答案:

答案 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)

From the spec:

正式称为增强型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)

这一切都取决于你的收藏。

如果您的集合是一个列表(通常为ArrayListLinkedList),那么迭代器将按照列表顺序排列。

如果是地图或集合,则很难预测其成员的顺序。如果您使用的是地图或集合,实际上您不应指望任何类型的可预测排序,因为它与这些集合的目的不匹配。但是,如果您需要特定订单但需要Map或Set的功能,则可以使用LinkedHashMapLinkedHashSet