【发布时间】:2015-10-16 01:22:54
【问题描述】:
我知道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 接受的答案中,我遇到了for 循环使用这种不寻常的Iterator:
//Unconventional for loop style
for (Iterator<String> iterator = list.iterator(); iterator.hasNext();) {
String string = iterator.next();
//...further code goes here
}
现在,我想知道:
- 这种非传统风格是否会一遍又一遍地为每次迭代在集合上创建迭代器?或者它是某种特殊的智能 for 循环,它创建一次迭代器并重用它? 如果它每次都创建一个迭代器,那不应该是性能问题吗?
- 我们能否将常规样式中的 while 循环行替换为
for(;iterator.hasNext();),如果我只使用for循环?
PS:我很清楚在集合上使用增强的 for 循环。我正在查看此内容的目的是“安全”删除元素,而不会导致ConcurrentModificationException。
【问题讨论】:
-
这是一个非常传统的迭代器使用;它只创建一次迭代器(for 循环的第一条语句,如果有的话,只执行一次)。事实上它完全等同于你的第一段代码
-
不完全等价,这样
iterator变量就不能再在for循环之外使用了,非常方便。 -
你的第一个问题很奇怪(至少对我来说)。如果你看到这个
for (int i = 0; i < 10; i++)会问同样的问题吗?您是否还会问是否在每次迭代时重新创建i? (是的,这与for循环完全相同) -
@Tom:是的.. 现在我意识到这一点似乎很愚蠢。感谢您用如此简单直接的示例指出这一点。我显然错过了。
标签: java performance for-loop while-loop iterator