Java 它在向集合中添加字符串之前是否进行了复制?

Java 它在向集合中添加字符串之前是否进行了复制?,java,Java,这很自然 然而,我在用另一种方式思考。“字符串”是指向实际字符串对象的引用(指针)。执行add()时,它只存储引用。当“string”引用另一个string对象时,为什么列表仍然保留原始对象?它是否在add()之前进行复制?字符串变量的“值”是对作为字符串的(不可变)对象的引用 所以这里没有字符串的副本,只有引用的副本。拥有此引用不允许您更改原始变量(您没有到它的链接),也不允许您更改字符串,因为它是不可变的 这里,在两个要添加的调用之后arrayList包含的数组中,有两个不同的引用。它们可以

这很自然

然而,我在用另一种方式思考。“字符串”是指向实际字符串对象的引用(指针)。执行add()时,它只存储引用。当“string”引用另一个string对象时,为什么列表仍然保留原始对象?它是否在add()之前进行复制?

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

所以这里没有字符串的副本,只有引用的副本。拥有此引用不允许您更改原始变量(您没有到它的链接),也不允许您更改字符串,因为它是不可变的

这里,在两个要添加的调用之后arrayList包含的数组中,有两个不同的引用。它们可以指向同一个字符串,但更改一个引用不会更改另一个引用。如果您想将本例中的第一个引用更改为指向与第二个相同的字符串,最简单的方法是执行
list.set(0,list.get(1))

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

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

123
456

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

因为变量“string”只是指向内存中地址的指针。在列表中添加“字符串”时,“字符串”的内存地址将输入列表中。再次赋值时,只需更改内存中新变量指向的地址即可

。参考资料副本。因此,在第一个add()之后,有两个指向“123”的引用,它们是“string”和“list”的第一个元素。对吧?对。需要理解的一点是,变量类型的对象的值是对该对象的引用。当您将此引用传递给一个方法时,您复制了它,而没有传递对变量的引用。@htyleo:“因此在第一个add()之后,有两个引用指向“123”…“Right”。(实际上有三种,因为您使用了字符串文字来初始化
字符串
,因此池中也有对它的引用[所有字符串文字都自动插入]。)
123
456
string = "456";