Java 非常规使用迭代器对集合进行迭代
我知道Java 非常规使用迭代器对集合进行迭代,java,performance,for-loop,while-loop,iterator,Java,Performance,For Loop,While Loop,Iterator,我知道列表的常规迭代器创建用法如下: //Conventional-style Iterator<String> iterator = list.iterator() while(iterator.hasNext()){ String string = iterator.next(); //...further code goes here } 现在,我想知道: 这种非常规样式是否会为每次迭代在集合上一次又一次地创建迭代器?或者它是一种特殊的智能for循环,只创建一次迭
列表的常规迭代器创建用法如下:
//Conventional-style
Iterator<String> iterator = list.iterator()
while(iterator.hasNext()){
String string = iterator.next();
//...further code goes here
}
现在,我想知道:
这种非常规样式是否会为每次迭代在集合上一次又一次地创建迭代器?或者它是一种特殊的智能for循环,只创建一次迭代器并重用它?
如果它每次都创建一个迭代器,这不是性能问题吗
我们是否可以将传统样式的while环线替换为
for(;iterator.hasNext();)
,如果我只为循环使用
PS:我很清楚在集合中使用增强的for循环。我考虑这个问题的目的是“安全”地删除元素,而不会导致ConcurrentModificationException
您称之为“非常规”的习惯用法实际上是推荐的,因为它将迭代器变量的范围限制在使用它的循环中
迭代器在循环开始之前创建一次。这源于for
循环的一般语义,我强烈建议您熟悉它
您可以,但不会被推荐。这样的习惯用法将是对while
习惯用法的毫无意义的混淆
最后,请注意,对于99%的用例,上述所有内容都没有实际意义,因为您确实应该使用增强的for循环或Java8forEach
您称之为“非常规”的习惯用法实际上是推荐的,因为它将迭代器变量的范围限制在使用它的循环中
迭代器在循环开始之前创建一次。这源于for
循环的一般语义,我强烈建议您熟悉它
您可以,但不会被推荐。这样的习惯用法将是对while
习惯用法的毫无意义的混淆
最后,请注意,对于99%的用例来说,上述所有内容都没有实际意义,因为您确实应该使用增强的for循环或Java8forEach
1.
不,它不会一次又一次地创建迭代器。。这是Java包含接口Iterable之前的完美风格。
如果要在对集合进行迭代时删除项,则必须使用迭代器.remove()
方法(如果提供)。。因为否则将抛出ConcurrentModificationException
如果不希望在迭代集合时删除项,则应仅使用for each概念,该概念由实现Iterable
接口的每个集合提供。(有关更多信息,请参见末尾的链接)
2.
对使用for循环习惯用法。但正如我所说,如果不想使用迭代器.remove()
操作,而只想迭代集合,那么应该使用为每个概念提供的
您可以在这里找到大量有关迭代器的缺点的信息。next()方法以及为什么新集成的for:each概念更好:
1.
不,它不会一次又一次地创建迭代器。。这是Java包含接口Iterable之前的完美风格。
如果要在对集合进行迭代时删除项,则必须使用迭代器.remove()方法(如果提供)。。因为否则将抛出ConcurrentModificationException
如果不希望在迭代集合时删除项,则应仅使用for each概念,该概念由实现Iterable
接口的每个集合提供。(有关更多信息,请参见末尾的链接)
2.
对使用for循环习惯用法。但正如我所说,如果不想使用迭代器.remove()
操作,而只想迭代集合,那么应该使用为每个概念提供的
您可以在这里找到大量有关迭代器的缺点的信息。next()方法以及为什么新集成的for:each概念更好:
Java源于C,因此(A;B;C){p;}
的语义与A;而(B){P;C;}
。唯一的区别是变量的范围。具体而言,A
部分只执行一次。因此,您的两个代码示例的作用完全相同,但在for
变量中,变量的范围受到限制
迭代集合的更现代的方法是Enhanced for循环:
for (String string : list) {
...
}
但是,如果您想在遍历项目时删除或更改项目,则仍然需要迭代器版本。例如:
for (Iterator<String> it = list.iterator(); it.hasNext();) {
String string = it.next();
if (someFunction(string)) {
it.delete();
}
}
for(Iterator it=list.Iterator();it.hasNext();){
String String=it.next();
if(someFunction(string)){
it.delete();
}
}
没有增强的for循环等价物。Java是从C派生的,因此(A;B;C){p;}
的语义与A;而(B){P;C;}
。唯一的区别是变量的范围。具体而言,A
部分只执行一次。因此,您的两个代码示例的作用完全相同,但在for
变量中,变量的范围受到限制
迭代集合的更现代的方法是Enhanced for循环:
for (String string : list) {
...
}
但是,如果您想在遍历项目时删除或更改项目,则仍然需要迭代器版本。例如:
for (Iterator<String> it = list.iterator(); it.hasNext();) {
String string = it.next();
if (someFunction(string)) {
it.delete();
}
}
for(Iterator it=list.Iterator();it.hasNext();){
String String=it.next();
if(someFunction(string)){
it.delete();