Why JAVA foreach doesn't change element value?

2018-12-31 05:53发布

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 foreach
7条回答
临风纵饮
2楼-- · 2018-12-31 06:17

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++;
}
查看更多
人气声优
3楼-- · 2018-12-31 06:22

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';
    }
}
查看更多
姐姐魅力值爆表
4楼-- · 2018-12-31 06:23

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.

查看更多
孤独总比滥情好
5楼-- · 2018-12-31 06:23

In my perspective the author actually asks for a reasons of so build function. I can't find any good reason of such move. Is it becouse for-each loop is meant to be an universal or in least editting directly so obtained variable would need some special treatment in various methods?

This loop is waged by additional fields and instructions. It seems to be good just for a simple, rapid and short-living quotes. I would use it in a perspective of a very short time to write - challanges, debugging, pressure at work.

With lambda - this makes a group of a tricky methods. But that's a legacy of high level programming and quick life unfortunately, IMO.

查看更多
像晚风撩人
6楼-- · 2018-12-31 06:24

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';
}
查看更多
旧人旧事旧时光
7楼-- · 2018-12-31 06:30

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.

查看更多
登录 后发表回答