![](/img/trans.png)
[英]How to use multiple threads in Java to iterate over a Collection where no two threads ever iterate over the same part of the Collection?
[英]Unconventional use of Iterator to iterate over a collection
我知道List<String> list
的常规迭代器创建用法如下:
//Conventional-style
Iterator<String> iterator = list.iterator()
while(iterator.hasNext()){
String string = iterator.next();
//...further code goes here
}
但是,在遍历集合的公认答案中,避免在删除循环时避免ConcurrentModificationException ,我遇到了与Iterator
一起for
循环的异常情况:
//Unconventional for loop style
for (Iterator<String> iterator = list.iterator(); iterator.hasNext();) {
String string = iterator.next();
//...further code goes here
}
现在,我想知道:
for
循环,是否可以用for(;iterator.hasNext();)
替换传统样式的while循环行? PS:我很清楚集合中循环使用的增强。 我这样做是为了“安全”地删除元素,而不引起ConcurrentModificationException
。
实际上,建议您使用“非常规的”成语,因为它将iterator变量的范围限制为使用它的循环。
在循环开始之前,迭代器创建一次。 这是基于for
循环的一般语义的,我热烈建议您熟悉它。
您可以,但是不建议您这样做。 这样的习惯用法对while
习惯用法毫无意义。
最后,请注意,对于99%的用例,上述所有内容都是没有意义的,因为您确实应该使用增强的for循环或Java 8 forEach
。
Java是从C派生的,因此for (A; B; C) { P; }
for (A; B; C) { P; }
与A; while (B) { P; C; }
具有相同的语义A; while (B) { P; C; }
A; while (B) { P; C; }
A; while (B) { P; C; }
。 唯一的区别是变量的范围。 特别是, A
部分仅执行一次。 因此,您的两个代码示例完全相同,但是在for
-variant中,变量的范围受到限制。
遍历集合的更现代的方法是增强for循环:
for (String string : list) {
...
}
但是,如果要在迭代过程中删除或更改项目,则仍需要迭代器版本。 例如:
for (Iterator<String> it = list.iterator(); it.hasNext();) {
String string = it.next();
if (someFunction(string)) {
it.delete();
}
}
没有增强的for循环等效项。
1.不,它不会一遍又一遍地创建迭代器。.这是Java包含接口Iterable<T>
之前的完美样式。 如果要在遍历集合时删除项目,则必须使用iterator.remove()
方法(如果提供)。.因为否则会引发ConcurrentModificationException。
如果不想在遍历集合时删除Item,则应仅对每个概念使用,这是每个实现Iterable<T>
接口的集合所提供的。 (最后的链接以获取更多信息)
for (String s : yourList) {
... // do something with the string
}
2.是的! 使用for循环惯用法。 但正如我所说,如果你不想使用iterator.remove()
操作,而只是想遍历集合,你应该使用提供给每个概念。
您可以在此处找到很多关于iterator.next()
方法的缺点的信息,以及为什么新集成的for:each概念更好的原因: https : //docs.oracle.com/javase/1.5.0/docs/guide /language/foreach.html
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.