Java 为什么Android Studio希望我使用For Each而不是For循环?

Java 为什么Android Studio希望我使用For Each而不是For循环?,java,for-loop,android-studio,foreach,Java,For Loop,Android Studio,Foreach,这个问题困扰了我一段时间。为什么Android Studio有时希望我使用For-Each而不是For-Loop,因为当我使用For-Loop时,我会收到一条警告,说明我可以对每个人使用它(使用Alt+Enter时,它会提示我自动修复) 例如,假设我们有以下代码 String a = ""; String[] array = {"A","B","C"}; for(int i = 0; i < array.length; i++) { a += array[i]; a +=

这个问题困扰了我一段时间。为什么Android Studio有时希望我使用For-Each而不是For-Loop,因为当我使用For-Loop时,我会收到一条警告,说明我可以对每个人使用它(使用Alt+Enter时,它会提示我自动修复)

例如,假设我们有以下代码

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

for(int i = 0; i < array.length; i++) {
    a += array[i];
    a += ",";
}
它的性能更好吗?有一个原因,我应该得到一个警告,因为我实际上只使用for循环


或者什么时候更适合循环还是每个循环?

摘自Joshua Bloch的书:高效Java(第二版)

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

当您看到冒号(:)时,将其读作“in”。因此,上面的循环读作“for each element e in elements”。请注意,没有 使用for each循环的性能损失,即使对于阵列也是如此。在里面 事实上,它可能会提供比普通for稍有性能优势的性能 循环,因为它计算数组的限制 索引只有一次。虽然您可以手动执行此操作(第45项),但程序员 不要总是这样做


下面是一个比较:

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;
    }
}
静态类Foo{
int mSplat;
}
Foo[]玛丽=。。。
公共无效零(){
整数和=0;
对于(int i=0;i
zero()
为循环中的每个迭代获取一次数组长度

one()
更快。它把所有东西都拉到局部变量中, 避免查找。只有阵列长度提供了性能 利益

two()
one()
用于具有JIT的设备。它使用增强的for循环语法 在Java编程语言的1.5版中引入

<默认情况下,应该使用增强的for循环,但是考虑 性能关键型ArrayList的手写计数循环 迭代。


如果您只是迭代而不向前或向后看,那么它的可读性就会更好。好的,如果您选择一个好的变量名,它是可读的(不像
字符串的
数组
:D)。这也有点安全,因为如果你是一个非常愚蠢的程序员,你可以编写
array[2*i]
并抛出
ArrayOutOfBoundsException
。除此之外,我觉得让你重构它有点夸张。。。这是Java中的一个常见习惯用法

    // The preferred idiom for iterating over collections and arrays
     for (Element e : elements) {
         doSomething(e);
     }
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;
    }
}