Я изучаю Java самостоятельно; и поэтому приведенный ниже код не имеет никакой функции, кроме обучения/тестирования.Java-модификация элементов в foreach
По сути, я пытаюсь изменить элементы массива Integer (а именно, поменьше их), в то время как в цикле foreach.
Следует отметить, что я не переупорядочиваю, не добавляю или не удаляю элементы; просто меняя свои ценности.
Вот мой код:
Logger.describe("Now copying half of that array in to a new array, and halving each element");
Integer[] copyArray = new Integer[DEFAULT_SAMPLE_SIZE/2];
System.arraycopy(intArray, 0, copyArray, 0, DEFAULT_SAMPLE_SIZE/2);
for (Integer x : copyArray) x /= 2;
Logger.output(Arrays.deepToString(copyArray));
Однако исходный массив (INTArray) заключается в следующем:
[47, 31, 71, 76, 78, 94, 66, 47, 73, 21]
И выход copyArray является:
[47, 31, 71, 76, 78]
Так что, хотя размер массива был уменьшен вдвое, элементы (целые числа) также не были уменьшены вдвое. Так что я делаю неправильно?
Спасибо
Я думаю, что это имеет отношение к Autoboxing, поэтому, когда вы делаете 'х/2', не изменяя значение объекта, но автоматически преобразует его в примитивный 'int' и делит его, поэтому ваш экземпляр Integer не влияет. – maksimov
Итак, оператор/= применим только к типам значений «int», а не к целым, ведущим переменную «x», которая должна быть преобразована в int? – Xenoprimate
По существу 'x = x/2' - это' x = новое целое число (x.intValue()/2) '. Поэтому, поскольку вы не добавляете его обратно в массив, вы не модифицируете элементы массива. – maksimov