调用anIterable.iterator()
是否返回新的或现有的Iterator?它依赖于Iterable实现吗?Iterable#iterator()是否返回一个新的迭代器或现有的迭代器?
更具体地说,以下代码是否按预期工作(即内循环将从头开始迭代)?
for (Item itemA : items) {
for (Item itemB : items) {
....
}
}
如果不是,比如何在Iterable
上实现这个目标?
调用anIterable.iterator()
是否返回新的或现有的Iterator?它依赖于Iterable实现吗?Iterable#iterator()是否返回一个新的迭代器或现有的迭代器?
更具体地说,以下代码是否按预期工作(即内循环将从头开始迭代)?
for (Item itemA : items) {
for (Item itemB : items) {
....
}
}
如果不是,比如何在Iterable
上实现这个目标?
可迭代
Iterable
是Interface
,我们需要为iterator()方法提供实现。在MyIterator
类的
public class MyCollection<E> implements Iterable<E>{
public Iterator<E> iterator() {
return new MyIterator<E>();
}
}
实施骨架:
public class MyIterator <T> implements Iterator<T> {
public boolean hasNext() {
//implement...
}
public T next() {
//implement...;
}
public void remove() {
//implement... if supported.
}
}
使用MyCollection
泛型,并用新的for循环
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的例子
anIterable.iterator()
应该返回一个新的迭代,并在这种情况下按预期的方式嵌套增强的for循环会工作。 Iterable
的所有标准实现在调用iterator()
时返回一个新的迭代器。
如果Iterable接口的某些错误实现在连续调用iterator()
时未返回新的Iterator,则嵌套的增强for循环将中断。
顺便说一下,Iterable
的Javadoc的iterator()
方法并不要求它返回一个新的迭代器。
您可以并行迭代相同的集合,但不能修改它。所以你的代码是完全正确的:每次都会返回新的iterator
。
Iterable<T>
是一个接口,所以没有默认的实现。
在ArrayList<T>
例如,iterator<E>
方法将返回嵌套类Itr
每次调用的新实例:
public Iterator<E> iterator() {
return new Itr();
}
取决于如何可迭代的接口被实现。通常,集合frameworl类将返回新实例。