我有以下代码
List<String> strings = new ArrayList<String>();
strings.add("a");
strings.add("b");
strings.add("c");
for (String s : strings) {
s = new String("x");
}
System.err.println(strings);
打印[a,b,c]
我认为它会打印[x,x,x],因为我遍历了Strings,后者返回对String对象的引用。在循环中,我将一个新的Object分配给引用,因此s应该指向新的String对象?
我的错在哪里?
更新数组中字符串的最佳方法是什么?
答案 0 :(得分:7)
在循环中,我将新对象分配给引用
好吧,您将新引用指定为s
的值。 s
只是一个局部变量,它是用元素的值初始化的。它与列表中的元素无关 - 这就是它初始化的方式。这有点像改变方法参数的值 - 它不会改变用作参数的任何变量:
void method(String y) {
y = "bar"; // This doesn't change x.
}
...
String x = "foo";
method(x);
System.out.println(x); // foo
如果你想更新列表中的字符串(不是数组 - 值得清楚区别),你应该使用常规for
循环:
for (int i = 0; i < strings.size(); i++) {
strings.set(i, "x");
}
答案 1 :(得分:1)
它打印&#34; a b c&#34;因为你没有改变(添加)列表中的任何内容。
for(String s:strings){ s = new String(&#34; x&#34;); }
以上代码可以理解为:
对于String s
中的每个 List strings
,设置为新的字符串值&#34; x&#34; 。你没有对列表做任何事情。您从列表中获取值,将其存储在s
中并覆盖s
。
答案 2 :(得分:1)
您只能更改本地s
变量的值,而不是List
中的元素。
您可以按List.set(int index, E element)
更改列表中的元素。
答案 3 :(得分:1)
s
仅在for
循环
for (String s : strings) {
s = new String("x");
}
每次迭代时,新String
个对象的值都会传递给s
,但strings
根本不会受到影响。