Java引用未更新

时间:2014-08-05 11:13:45

标签: java

我有以下代码

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对象?

我的错在哪里?

更新数组中字符串的最佳方法是什么?

4 个答案:

答案 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根本不会受到影响。