为什么java中有两种不同的for循环?

时间:2011-05-01 20:07:47

标签: java for-loop

我有一个for循环,我不确定它是如何工作的。我熟悉:

for(int i = 0; i <= 9; i++)
{
    /* implementation */
}

我对以下形式的for循环感到困惑:

String[] myString = new String[] {"one", "two", "three", "some other stuff"};

String str1 = "", str2 = "";  

for (String s :  myString)
{
    /* implementation */
}

这些类型的for循环如何工作?它们与常规for循环有什么不同?

8 个答案:

答案 0 :(得分:35)

第一个是原始for循环。初始化变量,设置终止条件,并提供状态递增/递减计数器(有例外,但这是经典的)

为此,

for (int i=0;i<myString.length;i++) { 
  System.out.println(myString[i]); 
}

是对的。

对于Java 5,提出了一种替代方案。可以支持任何实现iterable的东西。这在收藏中特别好看。例如,您可以像这样迭代列表

List<String> list = ....load up with stuff

for (String string : list) {
  System.out.println(string);
}

而不是

for (int i=0; i<list.size();i++) {
  System.out.println(list.get(i));
}

所以它只是一个替代符号。任何实现Iterable的项(即可以返回迭代器)都可以这样编写。

幕后发生的事情是这样的事情:(更有效率,但我明确地写了它)

Iterator<String> it = list.iterator();
while (it.hasNext()) {
  String string=it.next();
  System.out.println(string);
}

最后它只是语法糖,但相当方便。

答案 1 :(得分:4)

文章The For-Each Loop中对此功能有一个很好的总结。它通过示例显示了如何使用for-each样式可以生成更易于读写的更清晰的代码。

答案 2 :(得分:2)

for-each循环是在Java 1.5中引入的,并且与集合一起使用(并且是迂腐的,数组以及实现Iterable<E>接口的任何东西......本文指出):

http://download.oracle.com/javase/1,5.0/docs/guide/language/foreach.html

答案 3 :(得分:2)

使用第一个for - 循环,通过增加索引到数组的长度来手动枚举数组,然后手动获取当前索引的值。

后一种语法在Java 5中添加,并使用引擎下的Iterator实例枚举数组。然后,您只能访问对象(而不是索引),并且在枚举时您将无法调整数组。

当您只想对数组中的所有对象执行某些操作时,这很方便。

答案 4 :(得分:1)

新的for-each循环只是旧循环的简写。新循环更容易用于数组和一些迭代器,但不够灵活,因此在某些情况下必须使用旧循环,例如从0到9的计数。

答案 5 :(得分:1)

第二个for循环是迭代数组内容的简单方法,无需手动指定数组中的项数(手动枚举)。处理数组时,它比第一个方便得多。

答案 6 :(得分:1)

For-each循环,正如它所调用的,是一种for循环,与集合一起使用,以保证集合中的所有项都被迭代。例如

for ( Object o : objects ) {
    System.out.println(o.toString());
}

将对集合“objects”中的每个对象调用toString()方法。关于这一点的一个好处是你无法获得越界异常。

答案 7 :(得分:1)

没有其他答案触及的是你的第一个循环是通过列表索引。而for-each循环使用Iterator。像LinkedList这样的某些列表会使用Iteratorget(i)进行更快的迭代。这是因为链接列表的迭代器跟踪当前指针。而for i = 0到9中的每个get都必须将偏移重新计算到链表中。一般来说,最好使用for-each或Iterator,因为它将使用Collection迭代器,理论上它是针对集合类型进行优化的。