【问题标题】:Deep copy of immutable不可变的深拷贝
【发布时间】:2016-02-07 10:08:57
【问题描述】:

说不可变对象是在每次我们想要更改/引用原始对象时由深拷贝创建的,而可变对象是在我们创建另一个引用时由浅拷贝创建的。

例如:

   String s1 = "s";
   String s2 = s1;

和:

   Person p1 = new Person();
   Person p2 = p1;

就我而言,s2 将获得它自己的“s”副本(不是参考副本)。 这如何将字符串池概念与字符串文字的单个实例相匹配? 在 Person 的情况下,我们将有两个对一个 Person 实例的引用,对吗?

【问题讨论】:

  • 在您的第二个示例中,您不是制作浅拷贝,而是创建对同一实例的第二个引用
  • 没有一个案例创建第二个对象。仅复制引用。
  • 里面根本没有深拷贝。我认为您混淆了一些概念。你能告诉我们你从哪里得到分配一个不可变对象给你一个新副本的概念吗?
  • 虽然与此示例无关,但您确实提出了它。字符串池用于String s1 = "s"; String s2 = "s" 等情况。虽然不能保证,但在大多数情况下,这些字符串将存储在字符串池中,s1 == s2 将返回 true。
  • 这里:youtube.com/…

标签: java immutability


【解决方案1】:

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

String s1 = "s";
String s2 = s1;

这里,“s”是一个不可变对象(字符串),s1s2 只是引用。

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

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

【讨论】:

  • 你能看看这个 5 分钟的 tut 并告诉我这些家伙是否正确吗?我对这个概念的全部理解取决于他的解释。 youtube.com/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-04-12
  • 2014-07-06
  • 2015-01-13
  • 2011-09-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多