Foreach 循环中的神秘赋值:为什么它不影响底层数据
考虑下面令人困惑的代码片段:
String boss = "boss"; char[] array = boss.toCharArray(); for(char c : array) { if (c== 'o') c = 'a'; } System.out.println(new String(array)); //Why does this print "boss" and not "bass"?
尽管看似对迭代变量 c 进行了赋值,但输出仍然存在“老板”而不是预期的“低音”。为了解开这个谜团,我们深入研究 foreach 循环的细微差别。
迭代变量:纯粹的代理
使用 foreach 循环迭代集合时,迭代变量(在本例中为 c)仅表示元素的副本。本质上,它在访问底层集合时充当临时占位符。
修改占位符与更改集合
对迭代变量进行的赋值仅影响副本而不是原始集合。这相当于:
for (int i = 0; i < array.length; i++) { char c = array[i]; if (c == 'o') { c = 'a'; } }
虽然本地修改了c的值,但原始数组保持不变。
真实变化的强制修改
要真正修改底层集合,直接访问数组元素是必要:
for (int i = 0; i < array.length; i++) { if (array[i] == 'o') { array[i] = 'a'; } }
此代码显式更改数组的各个元素,从而产生所需的“低音”输出。
结论
了解 foreach 循环中迭代变量的真实性质对于避免混淆和确保有效的数据操作至关重要。通过对数组元素而不是迭代变量进行赋值,开发人员可以根据自己的预期需求自信地修改底层集合。
以上是为什么修改 Foreach 循环的迭代变量不会更改底层数组?的详细内容。更多信息请关注PHP中文网其他相关文章!