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
这很自然。
然而,我正在以另一种方式思考。 “string”是实际String对象的引用(指针)。执行add()时,它只存储引用。当“string”引用另一个String对象时,为什么列表仍保留原始列表?它是否在add()之前制作副本?
答案 0 :(得分:7)
String变量的“value”是对作为字符串的(immutable)对象的引用。
因此没有String的副本,而是引用的副本。拥有此引用不允许您更改原始变量(您没有链接)并且不允许您更改字符串,因为它是不可变的。
在这两个不同的引用之后,你在这里,在arrayList包含的数组中有两个不同的引用。它们可以指向相同的字符串,但更改一个引用不会更改另一个引用。如果你想在这种情况下改变第一个引用以指向与第二个相同的字符串,那么最简单的就是list.set(0, list.get(1));
答案 1 :(得分:2)
当“string”引用另一个String对象时,为什么列表仍保留原始列表?
您添加到列表中的是对字符串的引用。后来,当你做
string = "456";
您不是更改现有字符串,而是将不同字符串的引用分配给string
变量。原始字符串不变(实际上,Java中的字符串是不可变的)。
答案 2 :(得分:0)
因为变量'string'只是指向内存中地址的指针。当您在列表中添加“字符串”时,“字符串”的内存地址将输入列表中。当你再次分配一个值时,它只是更改新变量指向的内存中的地址