为什么javac有时会创建不必要的变量副本?

时间:2015-04-10 00:10:09

标签: java javac bytecode

我的代码如下:

boolean[] array = new boolean[200];
int[] indexes = {10, 42, 62, 74};
while(true) {
    //some code here
    StringBuilder sb = new StringBuilder();
    for (int j : indexes) {
        sb.append(array[j] ? '1' : '0');
    }
}

字节代码:

ASTORE 3 //"indexes" array
...
ALOAD 3
ASTORE 8
ALOAD 8
ARRAYLENGTH
...

我不确定为什么javac将ref数组复制到另一个本地var。

1 个答案:

答案 0 :(得分:6)

for-each循环转换为这样的东西:

{
    int[] hidden_array_ref = indexes;
    int hidden_length = hidden_array_ref.length;
    for(int hidden_counter = 0; hidden_counter < hidden_length; hidden_counter++) {
        int j = hidden_array_ref[hidden_counter];
        sb.append(array[j] ? '1' : '0');
    }
}

特别注意int[] hidden_array_ref = indexes;。那是你要问的副本。

编译器以这种方式执行它,以便在编写类似的内容时使用:

for(int j : indexes) {
    indexes = new int[0];
    sb.append(array[j] ? '1' : '0');
}

indexes的分配不会影响循环。