为什么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 – 这使得一组棘手的方法。 但不幸的是,这是高级编程和快速生命的遗产。