Вопрос-ответ

Why doesn't assigning to the iteration variable in a foreach loop change the underlying data?

Почему присвоение переменной итерации в цикле foreach не изменяет базовые данные?

Почему следующее выводит boss, а не bass?

String boss = "boss";
char[] array = boss.toCharArray();

for(char c : array)
{
if (c== 'o')
c = 'a';
}
System.out.println(new String(array)); //How come this does NOT print out bass?It prints boss.
Переведено автоматически
Ответ 1

Вы меняете переменную итерации c. Это не меняет содержимое массива. Переменная итерации - это просто копия элемента массива. Если вы хотите изменить массив, вам нужно сделать это явно:

for (int i = 0; i < array.length; i++) {
if (array[i] == 'o') {
array[i] = 'a';
}
}

Ваш исходный код эквивалентен (согласно разделу 14.14.2 JLS):

for (int i = 0; i < array.length; i++) {
char c = array[i];
if (c == 'o') {
c = 'a';
}
}

Изменение значения локальной переменной никогда ничего не изменит - оно просто изменяет локальную переменную. Присвоение:

char c = array[i];

копирует значение из массива в локальную переменную. Это не связывает локальную переменную с элементом массива постоянно.

Ответ 2

Это связано с тем, что c = 'a' присваивается a локальной переменной, c которая не ссылается на фактическое значение, присутствующее в этом индексе самого array. Он просто содержит копию значения, присутствующего в указанном индексе array. Таким образом, изменение фактически производится в локальной переменной, а не в фактическом местоположении, на которое array[i] ссылается.. Если вы хотите изменить значение, вам действительно следует использовать следующее:

int i = 0;
for(char c : array)
{
if (c== 'o')
array[i] = 'a';
i++;
}
Ответ 3

значение c является копией значения в массиве. Обратитесь к массиву напрямую, чтобы изменить соответствующее значение.

Ответ 4

Ваша переменная c изменяется, но не содержимое массива. Чтобы изменить массив, не используйте c, манипулируйте массивом напрямую.

for(int i = 0; i < array.length; i++)
{
char c = array[i];
if (c== 'o')
array[i] = 'a';
}
java