Java 不可变的深度拷贝

Java 不可变的深度拷贝,java,immutability,Java,Immutability,每次我们想要更改/引用原始对象时,深度复制都会创建不可变对象,而创建另一个引用时,浅复制会创建可变对象,这样说是否正确 例如: String s1 = "s"; String s2 = s1; 以及: 就我而言,s2将获得它自己的“s”副本(不是引用的副本)。 这如何使字符串池概念与字符串文本的单个实例相适应? 对于Person,我们将有两个引用到一个人实例,对吗 无法更改不可变对象。它们的状态在创造后保持不变。因此,“s”是常数。但指向它的引用可能会改变 String s1 =

每次我们想要更改/引用原始对象时,深度复制都会创建不可变对象,而创建另一个引用时,浅复制会创建可变对象,这样说是否正确

例如:

   String s1 = "s";
   String s2 = s1;
以及:

就我而言,s2将获得它自己的“s”副本(不是引用的副本)。 这如何使字符串池概念与字符串文本的单个实例相适应? 对于Person,我们将有两个引用到一个人实例,对吗

无法更改不可变对象。它们的状态在创造后保持不变。因此,“s”是常数。但指向它的引用可能会改变

String s1 = "s";
String s2 = s1;
这里,“s”是一个不可变的对象(字符串),
s1
s2
只是引用

防御副本用于通过返回具有相同值的新对象来防止对象上的状态更改(这是不变性故事的一部分)


附言:你没有在这里做深度复制。您只是在重新分配引用。

在第二个示例中,您不是在创建浅层副本,而是在同一个实例中创建第二个引用其中一个实例创建第二个对象。只复制了引用。其中根本没有深度复制。我想你把一些概念弄混了。你能告诉我们,分配一个不可变的对象会给你一个新的副本这个概念是从哪里来的吗?虽然与本例无关,但你确实提出了这个概念。字符串池用于
string s1=“s”等情况;字符串s2=“s”
。虽然不能保证,但在大多数情况下,这些字符串将存储在字符串池中,
s1==s2
将返回true。这里:你能看看这个5分钟的tut,告诉我这家伙是否正确吗?我对这个概念的全部理解取决于他的解释。
String s1 = "s";
String s2 = s1;