Подтвердить что ты не робот

Почему 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.
4b9b3361

Ответ 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

В моей перспективе автор фактически задает причины такой функции построения. Я не могу найти никаких оснований для такого движения. Разве это потому, что каждый цикл должен быть универсальным или, по крайней мере, редактированием, так что полученная переменная нуждалась бы в особом лечении различными способами?

Этот цикл ведется дополнительными полями и инструкциями. Кажется, это хорошо только для простых, быстрых и короткоживущих цитат. Я бы использовал его в перспективе очень короткое время для написания - проблемы, отладка, давление на работе.

С лямбдой - это делает группу сложных методов. Но это наследие программирования высокого уровня и быстрой жизни, к сожалению, ИМО.