3
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() 时,它只存储引用。当“字符串”引用另一个字符串对象时,为什么列表仍然保留原始对象?它会在 add() 之前进行复制吗?

4

3 回答 3

7

String 变量的“值”是对作为字符串的(不可变)对象的引用。

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

在两次调用 add 之后,arrayList 包含的数组内部是两个不同的引用。它们可以指向相同的字符串,但更改一个引用不会更改另一个引用。如果您想在这种情况下更改第一个引用以指向与第二个相同的字符串,最简单的方法是list.set(0, list.get(1));

于 2012-11-28T12:42:41.447 回答
2

当“字符串”引用另一个字符串对象时,为什么列表仍然保留原始对象?

您添加到列表中的是对字符串的引用。后来,当你这样做

string = "456";

您没有更改现有字符串,而是将对不同字符串的引用分配给string变量。原始字符串是不变的(实际上Java中的字符串是不可变的)。

于 2012-11-28T12:42:56.983 回答
0

因为变量'string'只不过是一个指向内存地址的指针。当您在列表中添加“字符串”时,“字符串”的内存地址将输入列表中。当您再次分配一个值时,它只是更改新变量指向的内存中的地址

于 2012-11-28T12:45:04.823 回答