淘先锋技术网

首页 1 2 3 4 5 6 7

在Java中,对象的克隆分为深克隆和浅克隆两种方式。两者虽然都是克隆,但是它们的实现方式和效果却存在很大的差别。

浅克隆(Shallow clone)根据需要逐一复制每个成员的值,但是对于成员中可能存在的对象,仅仅是拷贝了它的引用,而不是对象本身。这意味着,当这个被引用的对象被修改时,复制后的对象也会受到影响。因此,浅克隆只是创建了一个外层对象,而其内部的引用类型的成员是共享的。

public class Person implements Cloneable {
private String name;
private int age;
private ArrayListhobbies;
public Object clone() throws CloneNotSupportedException {
return super.clone();
}
}

深克隆(Deep clone)则不同,是指对整个对象及其所引用的对象进行复制,新的对象和原来的对象都是各自独立的,相互之间没有任何联系。这样,被复制后的对象不会受到原始对象的影响,可以完全独立使用。

public class Person implements Cloneable {
private String name;
private int age;
private ArrayListhobbies;
public Object clone() throws CloneNotSupportedException {
Person p = (Person) super.clone();
ArrayListlist = new ArrayList<>();
for (String hobby : this.hobbies) {
list.add(hobby);
}
p.hobbies = list;
return p;
}
}

在进行克隆时,需要注意被克隆的对象必须实现Cloneable接口,否则会抛出CloneNotSupportedException异常。并且在深克隆时,要注意对于所有引用类型的变量都进行复制,否则可能会影响到新的对象。

总的来说,浅克隆适用于需要比较少的内存控制场景,深克隆则适用于需要完全独立复制对象的场景,对于哪种克隆方式要使用,取决于实际的场景需求。