`
lihengzkj
  • 浏览: 45466 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

深度克隆和浅度克隆的总结

阅读更多
克隆的主对象:(重写了clone方法)
public class TestClonBean implements Cloneable,Serializable{
	private String name;
	private int age;
	private String sex;
	@Override
	protected TestClonBean clone(){
		TestClonBean bean = null;
		try {
			bean = (TestClonBean) super.clone();
		} catch (CloneNotSupportedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return bean;
	}
	省略get/set方法……
}

克隆的从属对象:
public class TestCloneChildBean implements Cloneable,Serializable{
	private String cname;
	private String csex;
	private int cage;
	省略get/set方法……
}

深度克隆的工具类:
(深度克隆的原理:把对象序列化输出到内存,然后从内存中把序列化的byte[]取出来,进行反序列化获取对象)
public class DeepCloneBean {
	public static Object getObject(Object obj){
		Object cloneobj = null;
		ByteArrayInputStream bin = null;
		ByteArrayOutputStream bout = null;
		try {
			//把对象对到内存中去
			bout = new ByteArrayOutputStream();
			ObjectOutputStream oos = new ObjectOutputStream(bout);
			oos.writeObject(obj);
			oos.close();
			//把对象从内存中读出来          
			ByteArrayInputStream bais = new ByteArrayInputStream(bout.toByteArray());
			ObjectInputStream ois = new ObjectInputStream(bais);
			cloneobj = ois.readObject();
			ois.close();
			return cloneobj;
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return null;
	}
}

测试:
public class TestClone {
	public static void main(String []args){
		//浅度克隆
		TestCloneChildBean tcc = new TestCloneChildBean();
		TestCloneChildBean tcc1 = tcc.clone();
		System.out.println(tcc==tcc1);//result:false;
		TestClonBean tcb = new TestClonBean();
		tcb.setChild(tcc);
		TestClonBean tcb1 = tcb.clone();
		System.out.println(tcb==tcb1);//result:false;
		System.out.println(tcb.getChild()==tcb1.getChild());//result:true;
		System.out.println("*****************浅度克隆完************");
		//深度克隆
		TestClonBean tt1 = new TestClonBean();
		TestCloneChildBean tc1 = new TestCloneChildBean();
		tt1.setChild(tc1);
		TestClonBean tcbclone = (TestClonBean) DeepCloneBean.getObject(tt1);
		System.out.println(tt1==tcbclone);//result:false;
		System.out.println(tt1.getChild()==tcbclone.getChild());//result:false;
	}
}

总结:
不管是深度克隆还是浅度的克隆其实都是产生了一个新的对象。所以我们在比较克隆对象和源对象的时候返回是false。而深度克隆和浅度的克隆的区别在于:浅度克隆的对象只会克隆普通属性,不会克隆对象属性。而深度克隆就会连对象属性一起克隆。所以我们在对比深度克隆中的tt1.getChild()==tcbclone.getChild()时,返回是false。而浅度克隆时返回true。
分享到:
评论
1 楼 yimengyuanyun 2013-02-01  
浅度克隆后,里面的对象是不是还是指向原来的对象,所以tcb.getChild()==tcb1.getChild()为true,这样理解对伐?

相关推荐

    解析JAVA深度克隆与浅度克隆的区别详解

    Java提供了两种主要的克隆方式:浅度克隆(Shallow Clone)和深度克隆(Deep Clone)。理解这两种克隆的区别对于优化内存管理和复制复杂对象至关重要。 **浅度克隆(Shallow Clone)** 浅度克隆仅仅复制了对象本身...

    ASP.NET深度复制和浅度复制分析

    ***中深度复制和浅度复制是编程中常见的概念,尤其是在涉及到对象复制和内存管理的场景中。为了理解这两个概念,首先我们需要明确值类型和引用类型的区别。 值类型直接存储其数据,而在.NET框架中包括了所有的基本...

    javascript克隆对象深度介绍

    在进行对象克隆的过程中,根据复制的深度,可以分为浅度克隆和深度克隆。 浅度克隆(Shallow Clone)仅适用于对象的第一层属性,如果属性值为基本类型,则复制其值;如果属性值为引用类型,则复制其引用地址。这...

    prototypeAndCreate.zip

    在“prototypeAndCreate.zip”压缩包中,我们可能找到与原型模式相关的代码示例,包括浅度克隆和深度克隆两种不同的复制策略。浅度克隆仅仅复制对象本身,而不复制其引用的对象,而深度克隆则会递归地复制对象及其...

    java-6个机制.doc

    **1.4 深度克隆与浅度克隆** - **浅度克隆**:仅复制对象的基本类型属性值,对于对象引用类型属性,只复制引用本身而非引用指向的对象。 - **深度克隆**:不仅复制对象本身,还递归复制对象内的所有引用对象。 **...

    实习总结知识

    - **浅度克隆**:只复制对象本身,对于对象中的对象仅复制其引用。 #### Collection与Collections的区别 - **Collection**:Java集合框架的一部分,定义了集合的行为。 - **Collections**:提供了用于操作或返回...

    UNDERSCORE_jquery:查看UNDERSCORE和jquery

    2. **实用函数**:包括`_.uniqueId`用于生成唯一ID,`_.clone`用于深度或浅度克隆对象,`_.isEqual`用于比较两个值是否相等,以及`_.throttle`和`_.debounce`用于节流和防抖,优化性能。 3. **对象操作**:...

Global site tag (gtag.js) - Google Analytics