我有这样的代码:
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 复制到数组到另一个本地变量中。
最佳答案
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
的赋值不会影响循环。
关于java - 为什么 javac 有时会创建不必要的变量副本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29551200/