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

时间:2013-08-13 14:26:52

标签: java performance loops iterator

使用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循环将Iterator的范围最小化到循环本身。这到底是什么意思呢?我应该使用while循环的for循环吗?

5 个答案:

答案 0 :(得分:6)

差别基本上是

在for循环中:

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

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

在while循环中

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

希望这有帮助。

答案 1 :(得分:1)

  

for循环将Iterator的范围最小化到循环本身。究竟是什么意思?

要在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
  

我应该使用while循环的for循环吗?

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

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

如果您不在循环中浏览迭代器的所有元素,最好使用while。这方面的一个例子可能是implementing a merge sort(注意:这个例子完全是出于学习目的)。

答案 2 :(得分:1)

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

在你的情况下使用更有意义的东西。迭代了集合中的所有元素后,是否需要迭代器?使用while循环。如果您不关心它,请使用for循环。

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

答案 3 :(得分:1)

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

<强>语法

变量的范围不同。在for情况下,变量只能在for头和body中访问,而在while情况下,它在循环后可用。作为一般规则,最好是使用更紧凑的范围,减少传输中的变量意味着在编码时担心更少的上下文。

<强>维护

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

除此之外:

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

答案 4 :(得分:1)

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

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

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

这也将限制list的范围,{{1}}的内存使用量比迭代器更重,因此更相关。


TL; DR

没关系。