2010-03-25 109 views

回答

10

为什么在java中引入这个循环?

这只是为了缓解对泛型集合和数组的循环。取而代之的

for (int i = 0; i < strings.length; i++) { 
    String string = strings[i]; 
    // ... 
} 

你可以做

for (String string : strings) { 
    // ... 
} 

这使得代码更易读,更好维护。

它是一个Java的创造?

不,它早在Java之前就存在于其他语言中。 Java在实现它时相对较晚。

它的用途是什么?

查看第一个答案。

要了解更多信息,请查看Sun guide on the subject

更新:这并不意味着它会使其他类型的循环变得多余。 for循环使用索引仍然有用,如果你想维护一个循环计数器用于其他目的而不是按索引获取项目。如果您想在循环中删除或更改集合本身的元素,则使用迭代器的for循环仍然很有用。

3

请参阅Foreach

对于每一个(或的foreach)是在 集合遍历项计算机 语言成语。 Foreach通常用 代替语句标准。 不像其他的循环结构, 然而,foreach循环1通常 保持无明显的计数器:他们 本质上说,“这样做是为了在这个集合一切 ”,而不是“做X 倍”。这避免了潜在的 逐个错误,并使代码 更易于阅读。在面向对象的 语言中,迭代器(即使是隐式的)通常被用作遍历的手段 。

几种语言,包括Python, 只有一个foreach循环,需要 显式计数才能实现 行为的“标准”。

而具体上的Java的部分:

一个foreach构建体在JDK 5.0中引入的。官方消息来源为该构造使用了多个名称。它被称为“For循环增强”,“For-Each循环”和“foreach语句”。

10

它掩盖了迭代器的使用,它使用起来沉重笨拙。有很多很多的实例,你只是想迭代一个集合而没有处理它的索引。 java的foreach结构使这成为可能。

+4

额外的重点应放在对事实口罩迭代器。诸如从列表中移除项目可以安全地用迭代器完成的操作在foreach循环中无法安全地完成。 – TwentyMiles 2010-03-25 18:04:42

2

这真的只是Java模仿功能性构造的时间更长,it's called map。实现它的原因是,制作一个循环只是简单地对容器的每个元素执行一个操作,而不考虑其索引。 Java的for(element : container) { doSomethingWith(element); }语法正是这样做比替代方案,它们要么做一个for循环与索引

for(int i=0; i<container.size(); ++i) { doSomethingWith(container.at(i)); } 

哪个更长,并创建一个不必要的指标变量,或者做一个循环清洁的方式迭代器

Iterator it = container.iterator(); 
while(it.hasNext()) { doSomethingWith(it.next()); } 

这也是更长。这个循环基本上是for(:) {}循环被编译成的东西,尽管可能会有一些细微的差别(我没有真正看到字节码)。

+0

+1小写错别字;如果不正确,则还原。另见http://java.sun.com/javase/6/docs/api/java/lang/Iterable.html – trashgod 2010-03-25 20:19:59

0

这是平淡的“语法糖”

不认为有任何效率的提高。

Java社区希望有点现代化的语言,C#和Ruby的竞争..