Why does the foreach statement not change the element value?
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.
Solution 1:
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:
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:
c's value is a copy of the value in array. Access array directly to change the value in question.
Solution 4:
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:
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';
}
}