Iterable#iterator()是否返回一个新的迭代器或现有的迭代器?

时间:2015-06-23 10:58:45

标签: java iterator iterable

调用anIterable.iterator()是否会返回新的或现有的迭代器?它是否依赖于Iterable实现?

更具体地说,以下代码是否会按预期工作(即内部循环将从头开始迭代)?

for (Item itemA : items) {
    for (Item itemB : items) {
        ....
    }
}

如果没有,那么如何在Iterable上实现这一目标?

5 个答案:

答案 0 :(得分:2)

<强>可迭代

IterableInterface,我们需要为iterator()方法提供实施。

public class MyCollection<E> implements Iterable<E>{

    public Iterator<E> iterator() {
        return new MyIterator<E>();
    }
}

MyIterator类的实现框架:

public class MyIterator <T> implements Iterator<T> {

    public boolean hasNext() {

        //implement...
    }

    public T next() {
        //implement...;
    }

    public void remove() {
        //implement... if supported.
    }
}

使用MyCollection生成,并使用新的for-loop

public static void main(String[] args) {
    MyCollection<String> stringCollection = new MyCollection<String>();

    for(String string : stringCollection){

    }
}

对于你的第二个问题,输出说话,内循环将从每次开始循环。

public static void main(String[] args) {
        List<String> names = new ArrayList<String>();
        names.add("a1");
        names.add("a2");

        for (String itemA : names) {
            for (String itemB : names) {
                System.out.println("Inner => " + itemB);
            }
            System.out.println("Outer => " + itemA);
        }
    }

Inner => a1
Inner => a2
Outer => a1
Inner => a1
Inner => a2
Outer => a2

参考this作为示例

答案 1 :(得分:2)

Iterable<T>是一个接口,因此没有默认实现。

例如,在ArrayList<T>中,iterator<E>方法将在每次调用时返回嵌套类Itr的新实例:

public Iterator<E> iterator() {
    return new Itr();
}

答案 2 :(得分:1)

anIterable.iterator()应该返回一个新的迭代器,在这种情况下,嵌套的增强型for循环将按预期工作。在Iterable被调用时,iterator()的所有标准实现都会返回一个新的迭代器。

如果Iterable接口的某些错误实现在连续调用iterator()时没有返回新的Iterator,则嵌套的增强型for循环将会中断。

BTW,Iterable的{​​{1}}方法的Javadoc不要求它返回一个新的迭代器。

答案 3 :(得分:0)

您可以并行迭代同一个集合,但不能修改它。所以你的代码是完全正确的:每次都会返回新的DateTime dt = DateTime.Now; // get current date time txtFormat.Text = string.Format("{0:yyyy/dd/MMM hh:mm:ss}", dt); // you can specify format according to your need

答案 4 :(得分:0)

取决于如何实现可迭代接口。通常,集合frameworl类返回新实例。