【问题标题】:Why does Android Studio want me to use For Each instead of For Loop?为什么 Android Studio 要我使用 For Each 而不是 For Loop?
【发布时间】:2015-09-13 10:44:01
【问题描述】:

这个问题一直困扰着我。为什么有时 Android Studio 想要我使用 For Each 而不是 For Loop,因为当我使用 For Loop 时,我会收到一条警告说我可以为 each 使用(并且使用 Alt+Enter 它会建议我使用自动修复)。

例如,假设我们有这段代码

String a = "";
String[] array = {"A","B","C"};

for(int i = 0; i < array.length; i++) {
    a += array[i];
    a += ",";
}

我收到警告

这是 Android Studio 建议的修复方法

for (String anArray : array) {
        a += anArray;
        a += ",";
}

性能更高吗?为什么我应该得到一个警告,因为我实际上只使用了 for 循环?

或者当循环或每个循环更好?

【问题讨论】:

    标签: java for-loop android-studio foreach


    【解决方案1】:

    摘自 Joshua Bloch 所著的《Effective Java (2nd Edition)》一书

    1.5 版中引入的 for-each 循环通过隐藏迭代器或索引来消除混乱和出错的机会 完全可变。由此产生的成语同样适用于 集合和数组:

        // The preferred idiom for iterating over collections and arrays
         for (Element e : elements) {
             doSomething(e);
         }
    

    当您看到冒号 (:) 时,将其读作“in”。因此,上面的循环读作“对于元素中的每个元素 e”。请注意,没有 使用 for-each 循环的性能损失,即使对于数组也是如此。在 事实上,它可能比普通的 在某些情况下循环,因为它计算数组的限制 只索引一次。虽然你可以手动完成(第 45 项),但程序员 不要总是这样做。


    这是来自http://developer.android.com/training/articles/perf-tips.html#Loops的比较:

    static class Foo {
        int mSplat;
    }
    
    Foo[] mArray = ...
    
    public void zero() {
        int sum = 0;
        for (int i = 0; i < mArray.length; ++i) {
            sum += mArray[i].mSplat;
        }
    }
    
    public void one() {
        int sum = 0;
        Foo[] localArray = mArray;
        int len = localArray.length;
    
        for (int i = 0; i < len; ++i) {
            sum += localArray[i].mSplat;
        }
    }
    
    public void two() {
        int sum = 0;
        for (Foo a : mArray) {
            sum += a.mSplat;
        }
    }
    

    zero() 最慢,因为 JIT 还不能优化 通过循环的每次迭代获取一次数组长度。

    one() 更快。它将所有内容提取到局部变量中, 避免查找。只有数组长度才能提供性能 受益。

    two() 对于没有 JIT 的设备来说是最快的,并且与 one() 适用于具有 JIT 的设备。它使用增强的 for 循环语法 在 Java 编程语言 1.5 版中引入。

    所以,你应该默认使用增强的 for 循环,但是考虑一个 用于性能关键型 ArrayList 的手写计数循环 迭代。

    【讨论】:

      【解决方案2】:

      当您只进行迭代而不向前或向后看时,它只会更具可读性。好吧,如果你选择一个好的变量名,它是可读的(不像anArray 用于String :D)。它也更安全一些,因为如果你是一个非常愚蠢的程序员,你可以写array[2 * i] 并抛出ArrayOutOfBoundsException。除此之外,我觉得要求你重构有点夸张......这是Java中的常见习语。

      【讨论】:

        猜你喜欢
        • 2013-12-10
        • 1970-01-01
        • 2015-01-02
        • 2018-10-04
        • 1970-01-01
        • 2014-01-11
        • 1970-01-01
        • 1970-01-01
        • 2019-09-19
        相关资源
        最近更新 更多