为什么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
这样的一些列表将使用Iterator
与get(i)
更快地Iterator
。 这是因为链接列表的迭代器跟踪当前指针。 而每次get
你的i = 0到9必须重新计算到链表中的偏移量。 通常,最好使用for-each或Iterator
因为它将使用Collection
s iterator,理论上它是针对集合类型进行优化的。