Java中FixedVector的clone方法为何是shallow clone而非deep clone?
为什么该FixedVector的clone方法属于浅拷贝而非深拷贝
首先明确判断深浅拷贝的核心标准:是否在拷贝时递归复制所有引用类型成员指向的实际对象,外层对象是否新建从来不是判断依据。
你提到的clone方法核心实现如下:
public Object clone() { FixedVector c = new FixedVector(data.length); for (int i = 0; i < length; ++i) { c.data[i] = data[i]; } return c; }
它属于浅拷贝的具体原因:
- 该实现确实新建了
FixedVector实例,也为新实例初始化了独立的底层data数组,但数组中存储的是Object类型的引用地址。循环赋值时仅做了引用地址的复制,没有对数组内存储的每个元素对象本身做克隆。 - 拷贝完成后,原对象和克隆对象的
data数组虽然是两个独立数组,但两个数组相同下标位置存的引用指向堆里的同一个对象实例。只要修改其中一个vector里存储的可变对象的内部属性,另一个vector里的对应对象也会同步变化,二者没有完全独立。
浅拷贝特征:仅复制当前对象本身、以及对象内基础类型的实际值,引用类型成员只复制引用地址,拷贝后原对象和克隆对象会共享引用类型的成员实例。
深拷贝特征:除了复制当前对象本身,还会递归复制所有引用类型成员指向的实际对象,拷贝完成后原对象和克隆对象完全独立,任意一方修改自身的任何内容都不会影响另一方。
如果要将该方法改造为深拷贝,循环赋值时不能直接传递元素引用,需要对每个存储的元素单独生成独立副本(比如对支持克隆的元素调用其自身的clone方法、通过序列化反序列化生成新实例等),再放入新数组中。
内容的提问来源于stack exchange,提问作者Osca
相关产品推荐
相关产品推荐

