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

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

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

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

 String[] myString = new String[] {"one", "two", "three", "some other stuff"}; String str1 = "", str2 = ""; for (String s : myString) { /* implementation */ } 

这些类型的for循环如何工作? 他们做什么不同然后定期循环?

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

为了那个原因,

 for (int i=0;i 

是正确的。

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

 List list = ....load up with stuff for (String string : list) { System.out.println(string); } 

代替

 for (int i=0; i 

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

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

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

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

在For For-Each循环文章中对此function进行了很好的总结。 它通过示例显示了如何使用for-each样式可以生成更易于读写的更清晰的代码。

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

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

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

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

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

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

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

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

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

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

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