我总是问自己“该使用什么”,应该使用for-循环还是前缀。在我看来,这两者都是“相同的”。我知道迭代列表等是一种更好的预测,但如果我们有以下情况怎么办:
for (String zipCode : zipCodes) {
if (zipCode.equals(zip)) {
return true;
}
}或
for (int i = 0; i < zipCodes.length; i++) {
if (zipCodes[i].equals(zip)) {
return true;
}
}还有什么更好呢?还是在这种情况下真的没什么区别?
发布于 2021-11-06 22:02:55
首先,for-each只是Iterator的语法糖。阅读JLS的本节。因此,我将把这个问题作为一个简单的FOR循环vs Iterator来解决。
现在,当您使用Iterator遍历集合时,至少要使用两种方法-- next()和hasNext(),下面是它们的ArrayList实现:
public boolean hasNext() {
return cursor != size;
}
@SuppressWarnings("unchecked")
public E next() {
checkForComodification();
int i = cursor;
if (i >= size)
throw new NoSuchElementException();
Object[] elementData = ArrayList.this.elementData;
if (i >= elementData.length)
throw new ConcurrentModificationException();
cursor = i + 1;
return (E) elementData[lastRet = I]; // hagrawal: this is what simple FOR loop does
}现在,我们都知道,如果在处理器上执行myArray[i] v/s完全实现next()方法,那么基本的计算就会有性能差异。所以,必须有不同的表现。
可能有些人会强烈地引用性能基准和有效Java的摘录,但我唯一能解释的方法是,这甚至是在甲骨文的官方文档中写的--请阅读下面RandomAccess接口文档中的这里。

我们很清楚地提到,会有分歧。所以,如果你能让我相信,在官方文档中写的东西是错误的,并且会被改变,我将准备接受这样的论点:简单的FOR循环和Iterator之间或者-没有性能上的差别。
所以IMHO,正确的方法来表达整个论点是这样的:
RandomAccess接口,那么简单的FOR循环(至少在理论上)将比Iterator或-each执行得更好。(这也是用RandomAccess文档编写的)RandomAccess接口,那么Iterator或FOR将执行(肯定)比简单的FOR循环更好的操作。发布于 2016-09-09 08:46:58
如果zipCodes[i]不是O(1),那么第二种情况的性能就会差得多。(也就是说,我认为在Java中还没有一个容器,其中[]不是O(1))。换句话说,简短的for循环不能更慢。
此外,简短的for循环更清晰,这确实应该是首要考虑,除非速度重要。
发布于 2016-09-09 08:50:31
现在的优化已经不那么重要了,因为除非您需要处理大量的数据,否则任何差异都是不明显的。另外,如果您使用了Collection,则性能将取决于所选的实现。
您真正应该考虑的是代码的质量。规则是,应该使用尽可能少的元素来尽可能清晰地表示逻辑,。第二个解决方案引入了一个新元素,即i索引,它实际上并不需要,只会使代码变得更加复杂。只有当您在每次迭代中实际需要知道索引时,才使用fori循环。
因此,从代码质量的角度来看,您应该使用第一个解决方案:-)
https://stackoverflow.com/questions/39407413
复制相似问题