我正在阅读J. Bloch" Effective Java"现在我在关于for-each
vs for-loop
的部分。他提到了我们无法使用for-each
循环的三种情况,其中一种情况如下:L
并行迭代 - 如果需要遍历多个集合 并行,那么你需要显式控制迭代器或索引 变量,以便可以前进所有迭代器或索引变量 锁步(无意识地在有缺陷的牌和骰子中表现出来) 上面的例子。)
案件对我来说不太清楚,我无法想象一个例子。
首先想到的是,它只是在多个线程中迭代相同的集合,但它可能不是他的意思。我没有看到任何限制阻止我们这样做(只读)。实际上:
public class MyRunnable implements Runnable{
private Collection<String> col;
//CTOR ommmited
public void run(){
for(String s : col){
//print o, not modify
}
}
然后我们用相同的实例启动一些线程。因此,我们不怕获取ConcurrentModificationException
(JavaDocs)因为我们执行只读访问,即使是同时多个线程也是如此。
出了什么问题?
答案 0 :(得分:6)
我不认为他的意思是&#34;并行&#34;和同时一样。
这简单得多。假设您有两个集合,并且您希望相同的循环(不是嵌套循环)迭代它们,并在每次迭代中获取每个元素的i
&#39;元素。你不能用增强的for循环来做到这一点,因为它隐藏了索引和迭代器。
您必须使用标准for循环(对于有序集合):
private List<String> one;
private List<String> two;
public void run(){
for(int i = 0; i<one.size() && i<two.size();i++){
// do something with one.get(i) and two.get(i)
}
}
或显式迭代器(对于无序的集合):
private Set<String> one;
private Set<String> two;
public void run(){
for(Iterator<String> iterOne=one.iterator(),Iterator<String> iterTwo=two.iterator(); iterOne.hasNext()&&iterTwo.hasNext();){
// do something with iterOne.next() and iterTwo.next()
}
}
答案 1 :(得分:1)
并行迭代 - 如果需要遍历多个集合 并行,那么你需要显式控制迭代器或索引 变量,以便可以前进所有迭代器或索引变量 锁步(无意识地在有缺陷的牌和骰子中表现出来) 上面的例子。)
简单的英语锁步意味着同时。这意味着您无法使用for-each
同时迭代多个集合。您将不得不使用单独的迭代器(
或者像Eran所示的循环,如下所示:
Iterator iterator1 = list1.iterator();
Iterator iterator2 = list2.iterator();
Iterator iterator3 = list3.iterator();
while (iterator1 .hasNext() && iterator2 .hasNext() && iterator3.hasNext()){
Item i1 = iterator1 .next();
Item i2 = iterator2 .next();
Item i3 = iterator3.next();
// rest of your code.
}