当前位置: 首页 > 面试题库 >

clone():ArrayList.clone()我认为是浅拷贝

邹书
2023-03-14
问题内容
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(),答案仅仅是56如果clone()是浅拷贝,为什么也没有显示?


问题答案:

浅拷贝并不意味着它们指向相同的存储位置。那只是一个任务:List b = a;

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

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



 类似资料:
  • 问题内容: 是Java中的浅拷贝? 最终,这到达Object(最上面的类)的clone()方法,该方法创建与该对象相同类的新实例,并将所有字段复制到该新实例(“浅表副本”)。 我从维基百科阅读了此内容。 我不明白为什么它是浅表。将创建一个包含所有字段的新实例。这只是深复制吗?困惑。需要给我一些解释。 问题答案: 默认确实是浅表副本。但是,除非您的对象实现,否则它的设计宗旨是抛出一个。 并且在实现时

  • 本文向大家介绍Java Clone深拷贝与浅拷贝的两种实现方法,包括了Java Clone深拷贝与浅拷贝的两种实现方法的使用技巧和注意事项,需要的朋友参考一下 1.首先,你要知道怎么实现克隆:实现Cloneable接口,在bean里面重写clone()方法,权限为public。 2.其次,你要大概知道什么是地址传递,什么是值传递。 3.最后,你要知道你为什么使用这个clone方法。 先看第一条,简

  • 问题内容: 似乎对此产生了很多困惑和不同意见([1]和其他来源),究竟会产生深拷贝还是浅拷贝。 该测试表明该副本很深: 该测试表明该副本较浅: 解决方案是否仅是制作顶层维度的深层副本,而其他维度是浅层副本?真相是什么? 问题答案: 它产生一个浅表副本,即一个包含“旧”引用的 新 数组(指向相同的对象,这些对象没有被复制)。 特别是,如果您有嵌套数组,则不会复制这些数组。您将得到一个新数组,其“顶级

  • 主要内容:到底是浅拷贝还是深拷贝对于基本类型的数据以及简单的对象,它们之间的拷贝非常简单,就是按位复制内存。例如: b 和 obj2 都是以拷贝的方式初始化的,具体来说,就是将 a 和 obj1 所在内存中的数据按照二进制位(Bit)复制到 b 和 obj2 所在的内存, 这种默认的拷贝行为就是 浅拷贝 ,这和调用 memcpy() 函数的效果非常类似。 对于简单的类,默认的拷贝构造函数一般就够用了,我们也没有必要再显式地定义一

  • 浅拷贝 对于对象或数组类型,当我们将a赋值给b,然后更改b中的属性,a也会随着变化。 也就是说,a和b指向了同一块堆内存,所以修改其中任意的值,另一个值都会随之变化,这就是浅拷贝。 深拷贝 那么相应的,如果给b放到新的内存中,将a的各个属性都复制到新内存里,就是深拷贝。 也就是说,当b中的属性有变化的时候,a内的属性不会发生变化。 参考链接: 深拷贝与浅拷贝的实现(一) javaScript中浅拷

  • 本文向大家介绍浅谈Java中实现深拷贝的两种方式—clone() & Serialized,包括了浅谈Java中实现深拷贝的两种方式—clone() & Serialized的使用技巧和注意事项,需要的朋友参考一下 clone() 方法麻烦一些,需要将所有涉及到的类实现声明式接口 Cloneable,并覆盖Object类中的clone()方法,并设置作用域为public(这是为了其他类可以使用到该