使用迭代器的for循环和while循环之间的区别

6

使用while循环的迭代器:

List<DataType> list = new ArrayList<DataType>();  
Iterator<YourDataType> it = yourList.iterator();  
while (it.hasNext())   
   // Do something

通过for循环使用迭代器:

   List<DataType> list = new ArrayList<DataType>();
   for ( Iterator<DataType> it = list.iterator(); list.hasNext(); ) 
      // Do something

我看过一些资料,说for循环可以将迭代器的作用域最小化到循环本身。这是什么意思?我应该使用for循环还是while循环呢?


关于最小化作用域,我个人认为这就像使用局部变量而非全局变量。有没有人能够确认这是否类似? - Michelle
5个回答

6

基本上有以下区别:

在for循环中:

for (Iterator<DataType> it = list.iterator(); list.hasNext(); ) 

在这种情况下,您在循环中声明了一个迭代器对象,并且它将在for循环后有资格进行垃圾回收(GC)。
在while循环中,由于您在循环外声明了Iterator对象,因此其作用域可能为整个程序或其所在的方法。如果在任何地方引用了它,则不会有资格进行GC。
希望这能帮助您。

1
for循环将迭代器的作用域最小化到循环本身。这意味着什么?
要在while循环中使用Iterator,必须在使用之前先声明和初始化它。因此,您可以这样做:
List<DataType> list = new ArrayList<DataType>();  
Iterator<YourDataType> it = yourList.iterator();  
while (it.hasNext()) {
}
it.hasNext(); //this compiles and will return false

for 循环中,Iterator 被声明为在 for 循环的作用域内,因此它只能在此循环的主体内使用。
List<DataType> list = new ArrayList<DataType>();
for ( Iterator<DataType> it = list.iterator(); list.hasNext(); ) {
}
it.hasNext(); //this won't work and is a compiler error since the variable it's outside its scope

我应该使用for循环还是while循环?

这完全取决于你的需求。通常,如果你要在单个循环中消耗迭代器的所有元素,则最好使用for循环方法,并且最好使用增强的for循环,它已经在幕后使用了Iterator

for(DataType data : list) {
    //...
}

在循环中如果你不需要遍历迭代器的所有元素,最好使用while。一个例子是实现归并排序(注:这个例子完全是为了学习目的)。

1
如JNL所说,如果作用域有限,垃圾收集器可以在循环后直接进行收集,而不是等到下一个 }。通常这并不是什么大问题——迭代器并不占用太多内存,而且通常在使用迭代器后很快就会结束作用域。例如,如果将两个代码示例放入一个方法中,它们将产生相同的作用域。另一种限制 while 循环作用域的方法是在其周围添加花括号,如下所示:
{
   List<DataType> list = new ArrayList<DataType>();  
   Iterator<YourDataType> it = yourList.iterator();  
   while (it.hasNext())   
      // Do something
}

这也会限制list的范围,它在内存使用上比迭代器更重,并因此更相关。
TL;DR的意思是“太长不看”,但在这个句子中,它的含义是“无关紧要”。

1
因为你在for循环内部声明了迭代器,所以你无法在外部使用它。它的作用域将被限制在for循环块中。
根据你的实际情况使用更合适的方法。如果你需要在遍历完集合中的所有元素后仍然需要迭代器,请使用while循环。如果你不需要它,请使用for循环。
请注意,当对象超出范围时,它们将变得可回收。

1

在语法和维护方面有两个重要的区别。

语法

变量的作用域不同。在 for 的情况下,变量仅在 for 头部和主体中可访问,而在 while 的情况下,它在循环后也可用。通常来说,拥有更紧密的作用域是更好的,意味着在编码时需要考虑的上下文更少。

维护

for 循环 具有将所有迭代操作紧密组合在一起以便进行检查的优点。

除此之外:

for 循环更易读,对于常规迭代模式更加全面,而 while 循环应保留给不规则迭代模式。


我不理解维护部分...这不取决于程序员的意见吗? - boxed__l
维护是指如果我们需要更改或更新迭代操作,即逻辑或步骤,我们可以在一个地方找到所有内容。 - heretolearn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接