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);
}
这个程序输出:
123
456
这很自然。
不过,我换个角度想。 “字符串”是对实际字符串对象的引用(指针)。执行 add() 时,它只存储引用。当“string”引用另一个String对象时,为什么列表中还保留着原来的那个?它会在 add() 之前制作副本吗?
最佳答案
字符串变量的“值”是对作为字符串的(不可变)对象的引用。
所以没有字符串的副本,而是引用的副本。拥有此引用不允许您更改原始变量(您没有指向它的链接)并且不允许您更改字符串,因为它是不可变的。
在两次调用 add 之后,在 arrayList 包含的数组中,您所拥有的是两个不同的引用。它们可以指向相同的字符串,但更改一个引用不会更改另一个。如果您想在这种情况下更改第一个引用以指向与第二个引用相同的字符串,最简单的方法就是执行 list.set(0, list.get(1));
关于java - 它会在将字符串添加到集合之前制作副本吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13605317/