java - clone() : ArrayList. clone() 我以为做了浅拷贝

标签 java clone

ArrayList<Integer> a=new ArrayList<Integer>();
a.add(5);
ArrayList<Integer> b=(ArrayList<Integer>)a.clone();
a.add(6);
System.out.println(b.toString());

在上面的代码中,我认为 clone() 做了一个浅拷贝。所以,ba 应该指向同一个内存位置。但是,当我执行 b.toString() 时,答案只有 5。为什么clone()做浅拷贝也不显示6

最佳答案

浅拷贝并不意味着它们指向同一个内存位置。那只是一个赋值:List b = a;

克隆会创建一个 实例,其中包含相同的 元素。这意味着您有 2 个不同的列表,但它们的内容是相同的。如果您在第一个列表中更改对象的状态,它将在第二个列表中更改。 (由于您使用的是不可变类型 - Integer - 您无法观察到这一点)

但是,您应该考虑不使用 clone()。它适用于集合,但通常被认为已损坏。使用复制构造函数 - new ArrayList(originalList)

关于java - clone() : ArrayList. clone() 我以为做了浅拷贝,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4592478/

相关文章:

ruby - 为什么 String::sub!() 会更改 Ruby 中克隆对象的原始对象?

java - 在 Java 中保留泛型的封装

azure - 尝试克隆 Azure 管道但出现 "references service connection ... not found"错误

java - 如何将第一个字符更改为数字?

java - 什么时候需要在方法签名中使用 "throws"?

java - viewParam返回空值

java - 关于条件的 Hibernate Search 性能建议

启用proguard时的java.lang.UnsatisfiedLinkError : No implementation found for java. lang.String

windows - 通过 ssh 从 cygwin 托管的存储库克隆到 Mac 和 FreeBSD 客户端时为 "(.hg not found)"

angularjs - 我收到 $firebase is not Defined with thinkester.io reddit 克隆