在将字符串添加到集合中之前是否复制了它?

hty*_*leo 3 java

List<String> list = new ArrayList<String>();
String string = null;
string = "123";
list.add(string);
string = "456";
list.add(string);

for (String s : list)
{
    System.out.println(s);
}
Run Code Online (Sandbox Code Playgroud)

该计划输出:

123
456
Run Code Online (Sandbox Code Playgroud)

这很自然.

但是,我在想另一种方式."string"是实际String对象的引用(指针).执行add()时,它只存储引用.当"string"引用另一个String对象时,为什么列表仍保留原始列表?它是否在add()之前复制?

Den*_*ret 7

String变量的"值"是对作为字符串的(不可变)对象的引用.

所以没有String的副本,而是引用的副本.拥有此引用不允许您更改原始变量(您没有链接)并且不允许您更改字符串,因为它是不可变的.

在两次调用add之后,在这里,arrayList包含的数组中有两个不同的引用.它们可以指向相同的字符串,但更改一个引用不会更改另一个引用.如果你想在这种情况下改变第一个引用指向与第二个相同的字符串,那么最简单的就是做list.set(0, list.get(1));