繁体   English   中英

非常规使用Iterator遍历集合

[英]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
}

现在,我想知道:

  1. 这种非常规的样式是否会一次又一次地为每次迭代在集合上创建迭代器? 还是某种程度上是一种特殊的智能for循环,它一次创建迭代器并重用它? 如果它每次都创建一个迭代器,那不是性能问题吗?
  2. 如果仅使用for循环,是否可以用for(;iterator.hasNext();)替换传统样式的while循环行?

PS:我很清楚集合中循环使用的增强。 我这样做是为了“安全”地删除元素,而不引起ConcurrentModificationException

实际上,建议您使用“非常规的”成语,因为它将iterator变量的范围限制为使用它的循环。

  1. 在循环开始之前,迭代器创建一次。 这是基于for循环的一般语义的,我热烈建议您熟悉它。

  2. 您可以,但是不建议您这样做。 这样的习惯用法对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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM