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 循环吗?

4

5 回答 5

6

区别基本上是

在 for 循环中:

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

在这种情况下,您在本地声明 Iterator 对象,它将是eligible for GC(garbage collection) after the for loop.

在while循环中,

while (it.hasNext())因为您已经在循环外声明了对象迭代器。所以它的范围是可能是 the entire programmethod it is in。或者如果它在任何地方被引用,那么它就不符合 GC 的条件

希望这可以帮助。

于 2013-08-13T14:30:25.483 回答
1

for 循环将迭代器的范围最小化到循环本身。这到底是什么意思呢?

Iterator在循环中使用,您必须在循环中使用之前while声明并初始化它。所以,你可以这样做:while

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使用的增强循环会更好:forIterator

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

如果您不会在循环中浏览迭代器的所有元素,最好使用while. 这方面的一个示例可能是实现合并排序(注意:此示例完全用于学习目的)。

于 2013-08-13T14:30:11.337 回答
1

因为您在 for 循环内声明了迭代器,所以您将无法在它之外使用它。它的范围将仅限于 for 循环块。

使用对您的情况更有意义的方法。遍历集合中的所有元素后是否需要迭代器?使用 while 循环。如果您不关心它,请使用 for 循环。

请注意,当事情超出范围时,它们就有资格进行垃圾收集。

于 2013-08-13T14:30:21.153 回答
1

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

句法

变量的范围不同。在这种for情况下,该变量只能在 for 标头和正文中访问,而在这种while情况下,它在循环之后可用。作为一般规则,最好有更紧凑的范围,更少的动态变量意味着在编码时需要担心的上下文更少。

维护

具有将所有迭代操作紧密组合在一起的for loop巧妙优势,因此可以一次性检查它们并进行检查。

除此之外:

for对于常规迭代模式,循环更具可读性和全面性,因为while循环应该保留给不规则迭代模式

于 2013-08-13T14:33:25.680 回答
1

正如 JNL 所说,在有限的范围内,垃圾收集可以在循环之后直接收集它,而不是直到下一个}

通常这是一个小问题 - 迭代器实际上并不占用太多内存,并且范围通常在使用迭代器后很快结束。例如,如果您将两个代码示例都放在一个方法中,它们将产生相同的范围。限制 while 循环范围的另一种方法是在其周围添加花括号,如下所示:

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

这也将限制 的范围list,它在内存使用方面比迭代器更重,因此更相关。


TL;博士

没关系。

于 2013-08-13T14:36:45.437 回答