![]() |
1
250
如果您只是在集合中漫游以读取所有值,那么使用迭代器和新的for循环语法之间没有区别,因为新的语法只是在水下使用迭代器。 但是,如果您的意思是循环旧的“C样式”循环:
然后,根据底层数据结构,新的for循环(或迭代器)可能更高效。这是因为对于某些数据结构,
为了验证迭代器是用新的for循环语法在水下使用的,将生成的字节码与下面两个Java代码段进行比较。首先是for循环:
第二,迭代器:
如您所见,所生成的字节代码实际上是相同的,因此使用这两种形式都不会造成性能损失。因此,对于大多数人来说,你应该选择对你最有吸引力的循环形式,因为它的样板代码更少。 |
![]() |
2
99
区别不在于性能,而在于性能。直接使用引用时,使用迭代器类型(例如,list.iterator()与list.listirator()相比,尽管在大多数情况下它们返回相同的实现),您可以更有效地显式地转换。您还可以在循环中引用迭代器。这允许您在不获取ConcurrentModificationException的情况下从集合中删除项目。 例如这是可以的:
这不是,因为它将引发并发修改异常:
|
![]() |
3
20
为了扩展保罗自己的答案,他已经证明了字节码在特定的编译器上是相同的(大概是Sun的javac?)但不同的编译器 放心 生成相同的字节码,对吗?为了了解两者之间的实际差异,我们直接进入源代码,并具体检查Java语言规范。 14.14.2, "The enhanced for statement" :
换言之,JLS要求两者等效。理论上,这可能意味着字节码的边际差异,但实际上,增强的for循环需要:
所以,换句话说,对于所有实际目的,字节码都是相同的,或者几乎相同的。很难想象任何编译器实现会导致两者之间的任何显著差异。 |
![]() |
4
1
这个
基于迭代器的循环的性能问题是因为它是:
一个潜在的优化是切换到
这里我们有:
我们减少了大量的方法调用和字段查找。你不想做的事
如果你知道这是完美的
|
![]() |
5
0
迭代器是Java集合框架中的一种接口,它提供遍历或迭代集合的方法。 当您的动机是遍历集合以读取其元素时,迭代器和for循环的行为都类似。
例如:
对于每个循环,只能在实现迭代器接口的对象上使用。 现在回到for循环和迭代器的情况。 当您试图修改一个集合时,会出现不同的情况。在这种情况下,迭代器由于其 fail fast属性 . 也就是说,它在遍历下一个元素之前检查基础集合结构中的任何修改。如果发现任何修改,它将 当前修改例外 . (注意:迭代器的这个功能只适用于java.util包中的集合类。它不适用于并发集合,因为它们本质上是故障安全的) |
![]() |
6
0
|
![]() |
7
-8
在处理集合时,应避免使用传统的for循环。 我将给出的简单原因是for循环的复杂度是O(sqr(n)),迭代器的复杂度甚至增强的for循环也只是O(n)。 所以它有一个性能上的区别。 只需拿一份1000件物品的清单,用两种方法打印出来。并打印执行的时差。你可以看到区别。 |
![]() |
Matt · 获取数组长度并推入每个对象 3 年前 |
![]() |
Pouya · Foreach循环不添加计数器 3 年前 |
![]() |
Andrea De Luca · 修改forEach中的元素使条目加倍 3 年前 |
![]() |
XFMW · 为什么我的foreach循环不能统一编译?[重复] 3 年前 |
![]() |
Red · 为什么我的字体大小不适合香草js? 3 年前 |
![]() |
aRTURIUS · Terraform for_每个问题的数据类型 3 年前 |
![]() |
Yerkin · 条件不适用于PHP和mysqli 3 年前 |