使用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循环吗?
答案 0 :(得分:6)
差别基本上是
for (Iterator<DataType> it = list.iterator(); list.hasNext(); )
在这种情况下,您在本地声明Iterator对象,它将是eligible for GC(garbage collection) after the for loop
。
while (it.hasNext())
因为你已经在循环外声明了对象Iterator。因此,范围可能是 the entire program
或method 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
没关系。