void cancelAll(Collection<TimerTask> c) {
for (Iterator<TimerTask> i = c.iterator(); i.hasNext(); )
i.next().cancel();
}
迭代器只是杂乱无章。此外,这是一个犯错的机会。迭代器变量在每个循环中出现三次:即两次出错的机会。for-each构造消除了混乱和出错的机会。下面是使用for each construct的示例:
void cancelAll(Collection<TimerTask> c) {
for (TimerTask t : c)
t.cancel();
}
当您看到冒号(:)时,将其读作“in”。上面的循环读作“for each timertask t in c”。如您所见,for each构造与泛型完美地结合在一起。它保留了所有类型的安全性,同时消除了剩余的混乱。因为不必声明迭代器,所以不必为它提供泛型声明(编译器会在你背后为你做这件事,但你不必担心。) 关于为什么我们应该使用for each循环而不是iterator的完整描述,请阅读以下内容: http://docs.oracle.com/javase/1.5.0/docs/guide/language/foreach.html
5条答案
按热度按时间hec6srdp1#
没有性能差异。但是通过使用迭代器,您可以使用更多的功能。例如,可以在循环中引用迭代器。这允许您执行诸如删除集合项以获取
ConcurrentModificationException
.您可以使用以下命令
但不是这个
但如果这种差异不困扰你,那么你可以用一个安慰你的孩子。
类似这样的问题
vktxenjb2#
迭代器可以从集合中删除()元素,这不能使用for each循环来完成
8wtpewkr3#
它们非常相似。考虑一下这个代码
然后我们使用
并为main方法获取以下字节码
第32到60行是第一个循环,第63到89行是第二个循环。你会注意到他们几乎是一样的-只是一些当地人的名字改变和轻微的重新排序。
因此,当编译器为这两个表达式生成相同的字节码时,它们是相同的。
b4lqfgs44#
第一种形式是在Java5中引入的,第二种形式主要出现在该语言早期版本的遗留代码中。尽管如此,仍有一些情况需要使用第二种形式;例如,如果循环需要能够在元素被迭代时移除部分(或全部)元素,那么您需要
itr
所以你可以称之为remove
方法。puruo6ea5#
在内部,它们都使用迭代器,唯一的区别是使用增强for循环时代码更清晰、更简短。以下是javadoc对这两者的看法:
对集合进行迭代比它需要的更糟糕。考虑以下方法,该方法获取计时器任务的集合并取消它们:
迭代器只是杂乱无章。此外,这是一个犯错的机会。迭代器变量在每个循环中出现三次:即两次出错的机会。for-each构造消除了混乱和出错的机会。下面是使用for each construct的示例:
当您看到冒号(:)时,将其读作“in”。上面的循环读作“for each timertask t in c”。如您所见,for each构造与泛型完美地结合在一起。它保留了所有类型的安全性,同时消除了剩余的混乱。因为不必声明迭代器,所以不必为它提供泛型声明(编译器会在你背后为你做这件事,但你不必担心。)
关于为什么我们应该使用for each循环而不是iterator的完整描述,请阅读以下内容:
http://docs.oracle.com/javase/1.5.0/docs/guide/language/foreach.html