首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >-回路前端性能差异

-回路前端性能差异
EN

Stack Overflow用户
提问于 2016-09-09 08:44:29
回答 4查看 745关注 0票数 1

我总是问自己“该使用什么”,应该使用for-循环还是前缀。在我看来,这两者都是“相同的”。我知道迭代列表等是一种更好的预测,但如果我们有以下情况怎么办:

代码语言:javascript
复制
for (String zipCode : zipCodes) {
    if (zipCode.equals(zip)) {
        return true;
    }
}

代码语言:javascript
复制
for (int i = 0; i < zipCodes.length; i++) {
    if (zipCodes[i].equals(zip)) {
        return true;
    }
}

还有什么更好呢?还是在这种情况下真的没什么区别?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2021-11-06 22:02:55

首先,for-each只是Iterator的语法糖。阅读JLS的本节。因此,我将把这个问题作为一个简单的FOR循环vs Iterator来解决。

现在,当您使用Iterator遍历集合时,至少要使用两种方法-- next()hasNext(),下面是它们的ArrayList实现:

代码语言:javascript
复制
    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,正确的方法来表达整个论点是这样的:

  1. 如果集合实现了RandomAccess接口,那么简单的FOR循环(至少在理论上)将比Iterator或-each执行得更好。(这也是用RandomAccess文档编写的)
  2. 如果集合没有实现RandomAccess接口,那么Iterator或FOR将执行(肯定)比简单的FOR循环更好的操作。
  3. 然而,就所有实际目的而言,每个都是最好的选择。
票数 3
EN

Stack Overflow用户

发布于 2016-09-09 08:46:58

如果zipCodes[i]不是O(1),那么第二种情况的性能就会差得多。(也就是说,我认为在Java中还没有一个容器,其中[]不是O(1))。换句话说,简短的for循环不能更慢。

此外,简短的for循环更清晰,这确实应该是首要考虑,除非速度重要。

票数 3
EN

Stack Overflow用户

发布于 2016-09-09 08:50:31

现在的优化已经不那么重要了,因为除非您需要处理大量的数据,否则任何差异都是不明显的。另外,如果您使用了Collection,则性能将取决于所选的实现。

您真正应该考虑的是代码的质量。规则是,应该使用尽可能少的元素来尽可能清晰地表示逻辑,。第二个解决方案引入了一个新元素,即i索引,它实际上并不需要,只会使代码变得更加复杂。只有当您在每次迭代中实际需要知道索引时,才使用fori循环。

因此,从代码质量的角度来看,您应该使用第一个解决方案:-)

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39407413

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档