深入研究迭代困境:为什么 Foreach 循环分配不会改变底层数据
尽管直接修改元素中的元素具有直观的吸引力foreach 循环,如以下 Java 代码片段所示:
String boss = "boss"; char[] array = boss.toCharArray(); for(char c : array) { if (c== 'o') c = 'a'; } System.out.println(new String(array)); //Unexpected result: "boss"
代码令人惊讶的是产生“boss”而不是预期的“bass”。
揭开副本
理解这个悖论的关键在于迭代变量“c”的本质”。与流行的看法相反,“c”仅代表手头数组元素的副本。修改“c”与原始数组内容无关。
数组修改揭秘
要真正改变数组,需要显式干预:
for (int i = 0; i < array.length; i++) { if (array[i] == 'o') { array[i] = 'a'; } }
这里,代码访问并修改实际的数组元素,导致数组被更新以反映所需的
理解 JLS 解释
Java 语言规范 (JLS) 将原始代码解释为等效于:
for (int i = 0; i < array.length; i++) { char c = array[i]; if (c == 'o') { c = 'a'; } }
这种分解强调“c”只是一个不能影响数组的副本。
本质上,foreach 循环提供一种简化的方法来迭代集合而不干扰其底层结构。直接数组修改需要显式地使用数组索引和元素。
以上是为什么修改 Java For-Each 循环中的字符不会更改原始数组?的详细内容。更多信息请关注PHP中文网其他相关文章!