java - 非常规使用 Iterator 迭代集合

标签 java performance for-loop while-loop iterator

我知道 List<String> list 的常规迭代器创建用法如下:

//Conventional-style
Iterator<String> iterator = list.iterator()
while(iterator.hasNext()){
   String string = iterator.next();
   //...further code goes here
}

然而,在Iterating through a Collection, avoiding ConcurrentModificationException when removing in loop的接受答案中,我遇到了这个不寻常的forIterator 循环使用:

//Unconventional for loop style
for (Iterator<String> iterator = list.iterator(); iterator.hasNext();) {
    String string = iterator.next();
    //...further code goes here
}

现在,我想知道:

  1. 这种非传统的风格是否会为每次迭代一遍又一遍地在集合上创建迭代器?或者它是某种特殊的智能 for 循环,它创建一次迭代器并重用它? 如果它每次都创建一个迭代器,难道不应该是一个性能问题吗?
  2. 我们能否将传统样式中的 while 循环行替换为 for(;iterator.hasNext();) ,如果我要使用 for仅循环?

PS:我很清楚在集合上使用增强的 for 循环。我正在考虑“安全”删除元素的意图,而不会导致 ConcurrentModificationException .

最佳答案

你称之为“非常规”的成语实际上是推荐的,因为它将迭代器变量的范围限制在使用它的循环中。

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

  2. 可以,但不建议您这样做。这样的习语将是对 while 习语的毫无意义的混淆。

最后,请注意,对于 99% 的用例,上述所有内容都没有实际意义,因为您确实应该使用增强的 for 循环或 Java 8 forEach

关于java - 非常规使用 Iterator 迭代集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31626307/

相关文章:

通过 DSN 的 Java MySql 连接

performance - Node.js 比 Apache 慢

c# - 静态字符串中的属性 Length 是在运行时还是在编译期间计算的?

java - 10*10 游戏的逻辑检查

java - 如何返回已加入的 hibernate 实体的列表?

java - 将 2D Mat 对象转换为 1D 数组

java - 我可以使用通过 ajax 传递的值来使用准备好的语句进行数据库搜索吗?

python - 向量化稀疏矩阵的 hellinger - NumPy/Python

c - for循环中的多个增量是什么意思?

ruby - 为什么 `for i in a` 不是惯用的 Ruby?