克隆方法
clone 是 Object 的一个方法,但是要支持 clone 方法,需要对象实现 Cloneable 接口,实现了 cloneable 接口后,可以使用 clone 方法。使用 clone 方法可以实现对象的克隆。
克隆的类型——浅克隆(ShallowClone)和深克隆(DeepClone)。
- 浅克隆是指拷贝对象时仅仅拷贝对象本身(包括对象中的基本变量),而不拷贝对象包含的引用指向的对象。
- 深克隆不仅拷贝对象本身,而且拷贝对象包含的引用指向的所有对象。
请看下面的例子:
package core;
/**
* @author 关注微信公众号:Java学习交流社区
* (更多技术干货、原创文章、面试资料,群聊吹水一应俱全)
*
* 测试clone方法
*/
public class CloneDemo {
public static void main(String[] args) throws CloneNotSupportedException {
A a = new A();
B b = new B();
a.setB(b);
A cloneA = (A)a.clone();
a.getB().setS("ss");
System.out.println(a == cloneA);
System.out.println(b == cloneA.getB());
System.out.println(cloneA.getB().getS());
}
}
class A implements Cloneable{
private B b;
public B getB() {
return b;
}
public void setB(B b) {
this.b = b;
}
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
class B implements Cloneable{
String s = "s";
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
public String getS() {
return s;
}
public void setS(String s) {
this.s = s;
}
}
运行结果:
false
true
ss
可以看出:
- 调用 clone 方法返回的 cloneA 与原对象 A 进行==比较,返回的是 false,即两个引用指向不同的对象
- 调用 clone 方法返回的 cloneA 中的属性 b 与原对象的 b 进行==比较,返回的是 true,即两个引用指向相同的对象
这种情况就是俗称的浅克隆,如果对象中所有的非基本类型属性都进行 clone,即为深克隆。
常用的浅克隆方法
Apache BeanUtils、PropertyUtils,Spring BeanUtils,Cglib BeanCopier(推荐使用,实测速度最快)
常用的深克隆方法
实现 Serializable 接口进行序列化和反序列化,各种 Json 格式的序列化和反序列化
扫码关注微信公众号《Java学习交流社区》,即可获取原创《Java并发编程与高并发解决方案》+《Redis》思维导图
作者:Java学习交流社区
地址:https://www.jvscc.cn/articles/2019/08/30/1567158083430.html
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于