为什么Android Studio要我使用For Each而不是For Loop?

use*_*647 10 java foreach for-loop android-studio

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

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

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

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

我收到警告

这是Android Studio建议的修复程序

for (String anArray : array) {
        a += anArray;
        a += ",";
}
Run Code Online (Sandbox Code Playgroud)

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

或者什么时候循环或每个循环更好?

Rid*_*hvi 26

来自Joshua Bloch的书:Effective Java(第2版)

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

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

当您看到冒号(:)时,将其读作"in".因此,上面的循环读作"对于元素中的每个元素e".请注意,使用for-each循环没有性能损失,即使对于数组也是如此.实际上,在某些情况下,它可能比普通的for循环提供轻微的性能优势,因为它只计算一次数组索引的限制.虽然您可以手动执行此操作(第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;
    }
}
Run Code Online (Sandbox Code Playgroud)

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

one()是比较快的.它将所有内容都拉到局部变量中,避免了查找.只有阵列长度才能提供性能优势.

two()没有JIT的设备速度最快,one()与具有JIT的设备无法区分 .它使用Java编程语言1.5版中引入的增强型for循环语法.

因此,您应该默认使用增强型for循环,但考虑一个手写的计数循环,用于性能关键的ArrayList迭代.