Why does the foreach statement not change the element value?

JavaForeach

Java Problem Overview


How come the following prints boss and not 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.

Java Solutions


Solution 1 - Java

You're changing the iteration variable c. That doesn't change the contents of the array. The iteration variable is just a copy of the array element. If you want to modify the array, you need to do so explicitly:

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

Your original code is equivalent (as per section 14.14.2 of the JLS) to:

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

Changing the value of a local variable will never change anything else - it just changes the local variable. The assignment:

char c = array[i];

copies the value in the array into a local variable. It doesn't associate the local variable with the array element perpetually.

Solution 2 - Java

This is because c = 'a' is assigning a to the local variable c which is not referencing the actual value present at that index of the array itself. It is just containing a copy of the value present at the specified index of array. So the change is actually made in the local variable not in the actual location where array[i] is referencing.. If you want to change value you should use the following indeed:

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

Solution 3 - Java

c's value is a copy of the value in array. Access array directly to change the value in question.

Solution 4 - Java

You variable c gets changed, but not the array contents. To change the array, don't use c, manipulate the array directly.

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

Solution 5 - Java

You're assigning 'a' to the local variable c, but not to the array element. To make it print bass, you'd need

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

Solution 6 - Java

Changes applied in 'for each' loop are made just inside her body (that's because values are copied, not referentions). To work on referentions use 'for' loop.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionKacy RayeView Question on Stackoverflow
Solution 1 - JavaJon SkeetView Answer on Stackoverflow
Solution 2 - JavaVishal KView Answer on Stackoverflow
Solution 3 - JavadanView Answer on Stackoverflow
Solution 4 - JavargettmanView Answer on Stackoverflow
Solution 5 - JavaJB NizetView Answer on Stackoverflow
Solution 6 - JavaMichał TaborView Answer on Stackoverflow