需要澄清Oracle教程,解释何时使用迭代器与for-each构造

时间:2019-01-14 13:04:52

标签: java collections iterator

在有关集合https://docs.oracle.com/javase/tutorial/collections/interfaces/collection.html的Oracle教程中 我看到以下内容:

Use Iterator instead of the for-each construct when you need to:

1. Remove the current element. The for-each construct hides the iterator, so you cannot call remove. Therefore, the for-each construct is not usable for filtering.
2. Iterate over multiple collections in parallel.

我了解迭代器支持而不是for-each构造支持的第一个选项“删除当前元素”。 我需要澄清第二个选项“并行遍历多个集合”,这可以使用迭代器而不是通过for-each来完成。有人可以提供这种情况的例子吗?据我了解,for-each也可以嵌套,这样一个人就可以并行处理多个集合。

这不是Iterator vs For-Each的重复项 和Iterator vs for中的 当他们问到迭代器和for-each的一般比较时,我问了Oracle教程中的具体句子。

2 个答案:

答案 0 :(得分:8)

假设您有两个集合:

List<A> listA = /*...*/;
List<B> listB = /*...*/;

...,您需要并行遍历它们(即,处理每个条目中的第一个条目,然后处理每个条目中的下一个条目,等等。)您无法使用增强型{{1} }循环中,您将使用for s:

Iterator

为了公平起见,您可以将增强的Iterator<A> itA = listA.iterator(); Iterator<B> itB = listB.iterator(); while (itA.hasNext() && itB.hasNext()) { A nextA = itA.next(); B nextB = itB.next(); // ...do something with them... } 循环与迭代器结合使用:

for

...但是它笨拙且清晰明了,只有其中一个集合可以成为Iterator<A> itA = listA.iterator(); for (B nextB : listB) { if (!itA.hasNext()) { break; } A nextA = itA.next(); // ...do something with them... } 的主题,其余集合必须是for s。

答案 1 :(得分:2)

  

据我了解,for-each也可以嵌套,所以一个可以   并行地在多个集合上旅行。

通过嵌套for-each,我们无法并行处理多个集合。

List<A> listA = /*...*/;
List<B> listB = /*...*/;

for(A a:listA){
    for(B b:listB){
        //do something
    }
}

以上代码无法实现travel on several collections in parallel,但需要为第一个集合的每个元素完全迭代第二个集合。

for(A:listA;B:listB)之类的东西无法在Java中编译。


请注意,除了Iterator,我们还可以使用传统的for循环:

for(int i=0,min=Math.min(listA.size(),listB.size());i<min;i++){
    // ...do something with them...
}