我有一个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
循环有什么不同?
答案 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
这样的某些列表会使用Iterator
与get(i)
进行更快的迭代。这是因为链接列表的迭代器跟踪当前指针。而for i = 0到9中的每个get
都必须将偏移重新计算到链表中。一般来说,最好使用for-each或Iterator
,因为它将使用Collection
迭代器,理论上它是针对集合类型进行优化的。