我想详细了解增强型For循环如何在Java中工作(假设我确实了解了这个循环的基本用法以及它的工作原理)。
给出以下代码:
String[] a = {"dog", "cat", "turtle"};
for (String s : a) {
out.println("String: " + s);
s = in.readLine("New String? ");
}
它实际上并没有修改原始列表'a'。 为什么不?内存管理如何工作?这不是'a [i]'的同一个存储单元的引用吗?
我在oracle文档中读到,增强for循环不能用于从原始数组中删除元素,这是有道理的。修改值是否相同?
提前致谢
答案 0 :(得分:10)
是不是'a [i]'的同一个存储单元的引用?
原来,是的。但是in.readLine
生成对新String对象的引用,然后用它来覆盖s
。但只覆盖s
,而不是基础字符串,也不覆盖数组中的引用。
答案 1 :(得分:4)
s
是一个指向String
实例的局部变量。它与a[i]
无关,它们最初碰巧具有相同的值。
答案 2 :(得分:3)
你只能写
for (int i = 0; i < a.length; i++) {
out.println("String: " + a[i]);
a[i] = in.readLine("New String? ");
}
您不能使用for-each循环来修改原始集合或数组。
答案 3 :(得分:1)
在s
中将地址视为对象。这里的事情是s
在使用for循环时指向数组的某个值。当您在循环中重新s
时,s
指向另一个值,但未修改数组的原始值,因为您只更改了地址 { {1}}指向。
s
答案 4 :(得分:1)
对于每次迭代,String最初引用String a []中相应的String对象。但它会引用另一个由in.readLine()返回的String对象。