为什么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. 

你正在改变迭代variablesc 。 这不会改变数组的内容。 迭代variables只是数组元素的副本 。 如果你想修改数组,你需要明确地这样做:

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

您的原始代码等同于(根据JLS第14.14.2节 ):

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

改变局部variables的值永远不会改变任何东西 – 它只是改变局部variables。 分配:

 char c = array[i]; 

将数组中的值复制到局部variables中。 它不会将本地variables与数组元素永久关联。

这是因为c = 'a'a赋值给本地variablesc ,该variables不引用array本身索引处的实际值。 它只是包含array的指定索引值的副本。 所以这个改变实际上是在本地variables中进行的,而不是在array[i]所引用的实际位置。如果你想改变它的值,你应该使用下面的代码:

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

variablesc得到了改变,但不是数组内容。 要更改数组,请不要使用c ,直接操作数组。

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

c的值是数组中的值的副本。 直接访问数组来更改有问题的值。

您将“a”分配给本地variablesc,但不分配给数组元素。 要打印低音,你需要

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

在'for each'循环中应用的变化只是在她的身体内部(这是因为值被复制,而不是引用)。 在引用上使用'for'循环。

在我看来,作者实际上是在寻求如此构buildfunction的理由。 我找不到任何这样的举动的好理由。 这是否是因为 – 每个循环意味着是一个普遍的或至less编辑直接如此获得的variables会需要在各种方法的特殊待遇?

这个循环是由额外的领域和指示。 这似乎是一个简单,快速和短生存的报价。 我会用很短的时间来写作 – 挑战,debugging,工作压力。

用lambda – 这使得一组棘手的方法。 但不幸的是,这是高级编程和快速生命的遗产。