Почему JAVA foreach не меняет значение элемента?
Каким образом следующие отпечатки босса, а не баса?
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
, но не содержимое массива. Чтобы изменить массив, не используйте c
, непосредственно манипулируйте массивом.
for(int i = 0; i < array.length; i++)
{
char c = array[i];
if (c== 'o')
array[i] = 'a';
}
Ответ 4
Значение c является копией значения в массиве. Прямой доступ к массиву доступа, чтобы изменить значение, о котором идет речь.
Ответ 5
Вы назначаете 'a' локальной переменной c, но не элементу массива. Чтобы заставить его печатать бас, вам понадобится
for (int i = 0; i < array.length; i++) {
if (array[i] == 'o') {
array[i] = 'a';
}
}
Ответ 6
Изменения, применяемые в цикле "для каждого", выполняются только внутри ее тела (это потому, что значения скопированы, а не референции). Для работы над референциями используйте цикл "для".
Ответ 7
В моей перспективе автор фактически задает причины такой функции построения.
Я не могу найти никаких оснований для такого движения.
Разве это потому, что каждый цикл должен быть универсальным или, по крайней мере, редактированием, так что полученная переменная нуждалась бы в особом лечении различными способами?
Этот цикл ведется дополнительными полями и инструкциями.
Кажется, это хорошо только для простых, быстрых и короткоживущих цитат.
Я бы использовал его в перспективе очень короткое время для написания - проблемы, отладка, давление на работе.
С лямбдой - это делает группу сложных методов.
Но это наследие
программирования высокого уровня и быстрой жизни, к сожалению, ИМО.