У меня код выглядит следующим образом:
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 copy ref для массива в другой локальный var.
Цикл 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
не влияет на цикл.
indexes
, которые копируются (в другую скрытую локальную переменную, которую я назвал hidden_array_ref
)
ALOAD 3
а затемASTORE 8
.