在java中对象的拷贝分为两种:
一种是:浅拷贝(实现Cloneable)
一种是:深拷贝(使用数据流的序列化与反序列化)
浅拷贝的缺点:
1、 基本类型
如果变量是基本很类型,则拷贝其值,比如int、float等。
2、 对象
如果变量是一个实例对象,则拷贝其地址引用,也就是说此时新对象与原来对象是公用该实例变量。
3、 String字符串
若变量为String字符串,则拷贝其地址引用。但是在修改时,它会从字符串池中重新生成一个新的字符串,原有对象保持不变。
如果变量是基本很类型,则拷贝其值,比如int、float等。
2、 对象
如果变量是一个实例对象,则拷贝其地址引用,也就是说此时新对象与原来对象是公用该实例变量。
3、 String字符串
若变量为String字符串,则拷贝其地址引用。但是在修改时,它会从字符串池中重新生成一个新的字符串,原有对象保持不变。
1:浅拷贝代码:
class Person implements Cloneable { /** 姓名 **/ private String name; /** 电子邮件 **/ private Email email; public String getName() { return name; } public void setName(String name) { this.name = name; } public Email getEmail() { return email; } public void setEmail(Email email) { this.email = email; } public Person(String name, Email email) { this.name = name; this.email = email; } public Person(String name) { this.name = name; } protected Person clone() { Person person = null; try { person = (Person) super.clone(); } catch (CloneNotSupportedException e) { e.printStackTrace(); } return person; } } class Email { private String message = ""; public String content = ""; public Email() { } public Email(String message, String content) { this.content = content; } public String getContent() { return content; } public void setContent(String content) { this.content = content; } } public class TestClone { public static void main(String[] args) { // 写封邮件 Email email = new Email("请参加会议", "请与今天12:30到二会议室参加会议..."); Person person1 = new Person("张三", email); Person person2 = person1.clone(); person2.setName("李四"); Person person3 = person1.clone(); person3.setName("王五"); person1.getEmail().setContent("请与今天12:00到二会议室参加会议..."); // person1.setEmail(new Email("", "请与今天12:00到二会议室参加会议..."));//须要新建对象才可能修改不同的 System.out.println(person1.getName() + "的邮件内容是:" + person1.getEmail().getContent()); System.out.println(person2.getName() + "的邮件内容是:" + person2.getEmail().getContent()); System.out.println(person3.getName() + "的邮件内容是:" + person3.getEmail().getContent()); } }
修改clone方法其现对象分离(其实就是新建了一个对象)
protected Person clone() { Person person = null; try { person = (Person) super.clone(); person.setEmail(new Email("",person.getEmail().getContent())); } catch (CloneNotSupportedException e) { e.printStackTrace(); } return person; }
2:深拷贝(被拷贝对象须要实现 Serializable接口)
拷贝对象的工具类
import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; public class CloneUtils { @SuppressWarnings("unchecked") public static <T extends Serializable> T clone(T obj){ T cloneObj = null; try { //写入字节流 ByteArrayOutputStream out = new ByteArrayOutputStream(); ObjectOutputStream obs = new ObjectOutputStream(out); obs.writeObject(obj); obs.close(); //分配内存,写入原始对象,生成新对象 ByteArrayInputStream ios = new ByteArrayInputStream(out.toByteArray()); ObjectInputStream ois = new ObjectInputStream(ios); //返回生成的新对象 cloneObj = (T) ois.readObject(); ois.close(); } catch (Exception e) { e.printStackTrace(); } return cloneObj; } }其它类
import java.io.Serializable; class Person implements Serializable { private static final long serialVersionUID = 3623459427337616520L; /** 姓名 **/ private String name; /** 电子邮件 **/ private Email email; public String getName() { return name; } public void setName(String name) { this.name = name; } public Email getEmail() { return email; } public void setEmail(Email email) { this.email = email; } public Person(String name, Email email) { this.name = name; this.email = email; } public Person(String name) { this.name = name; } } class Email implements Serializable{ private static final long serialVersionUID = 2913307304989215405L; private String message = ""; public String content = ""; public Email() { } public Email(String message, String content) { this.content = content; } public String getContent() { return content; } public void setContent(String content) { this.content = content; } } public class TestClone { public static void main(String[] args) { //写封邮件 Email email = new Email("请参加会议","请与今天12:30到二会议室参加会议..."); Person person1 = new Person("张三",email); Person person2 = CloneUtils.clone(person1); person2.setName("李四"); Person person3 = CloneUtils.clone(person1); person3.setName("王五"); person1.getEmail().setContent("请与今天12:00到二会议室参加会议..."); System.out.println(person1.getName() + "的邮件内容是:" + person1.getEmail().getContent()); System.out.println(person2.getName() + "的邮件内容是:" + person2.getEmail().getContent()); System.out.println(person3.getName() + "的邮件内容是:" + person3.getEmail().getContent()); } }参考:http://blog.csdn.net/chenssy/article/details/12952063
相关推荐
JavaScript中的对象拷贝是编程中常见的操作,尤其在处理复杂数据结构时显得尤为重要。对象拷贝分为两种主要类型:浅拷贝和深拷贝。 浅拷贝是指创建一个新对象,新对象的属性引用了原对象中属性的引用。这意味着,当...
Java EE对象拷贝工具Dozer是一款强大的数据映射库,它简化了在Java对象之间进行深度复制的过程。在软件开发中,特别是在业务层处理数据时,我们经常需要将一个对象的属性值复制到另一个对象中,Dozer提供了一个优雅...
### 对象拷贝:MapStruct 作为一种优雅的解决方案 #### MapStruct 介绍 MapStruct 是一种类型安全的 bean 映射类生成 Java 注释处理器,它简化了对象间属性的映射过程。开发者只需定义一个映射接口并声明所需的...
Sigslot 是一个小型但功能强大的 C++ 开源库,专门用于实现信号(signals)和槽...通过修复信号对象拷贝的问题,它变得更加可靠,适用于更广泛的场景。在实际开发中,结合 sigslot 可以设计出更灵活、响应式的系统。
用于两个domain对象的拷贝,支持字段自动覆盖,选择性覆盖,选择性字段拷贝,作用:当你有多个domain对象都需要生成另外的同一个domain对象的时候这个方法就很有用了,或许存在BUG,欢迎指出
要求把目标房间内需要拷贝的对象做成一个组(Group),如果有些对象不希望拷贝,可以不放入组内。 所以你需要先把一个房间内的东西都布置创建好,并且用Revit命令需要为每一个房间创建Room对象。有了这些条件就...
工具包目前集成了通用响应实体、对象拷贝、集合转换、加密工具、格式化工具、随机中文、JSR校验、常用自定义异常、swagger-ui和驼峰转换等工具。每个工具的详细实用见README.md文档,有非常详细的记录。
要求把目标房间内需要拷贝的对象做成一个组(Group),如果有些对象不希望拷贝,可以不放入组内。 所以你需要先把一个房间内的东西都布置创建好,并且用Revit命令需要为每一个房间创建Room对象。有了这些条件就...
本篇文章将深入探讨Objective-C中的赋值与对象拷贝,特别是深拷贝和浅拷贝的概念。 首先,我们要了解赋值操作(Assignment)。Objective-C中有两种类型的对象:基本数据类型(如结构体)和基于NSObject的对象。对于...
对多维数组,对象,进行去重,相同的值只保留一个,常见的new Set()和filter,只能去重一维数组,并不能进行深层的去重,逻辑:判断是否为对象,为对象判断是否为数组或是真的对象,递归一直筛选为值,判断首次...
Omu.ValueInjecter.dll 更多信息请移步http://valueinjecter.codeplex.com/
Java CopyUtil工具类,可以进行对象的深copy,比如:对象里面包含对象,对象里面包含Map,List,Set...等复杂类型的属性都可以copy,copy后的对象与原有对象没有联系,即改变原有对象内容,不会改变copy后的对象里面的...
在JavaScript编程中,对象拷贝与赋值是经常会用到的操作,但这两者是有显著区别的。对象赋值通常意味着让一个变量引用另一个已经存在的对象,也就是在内存中两个变量指向同一个对象的地址。而对象拷贝则是创建一个新...
Java对象拷贝常见面试题及应答汇总 在Java编程中,对象拷贝是一种常见的操作, 涉及到对象的复制和克隆。下面总结了一些常见的面试题和应答,供大家学习和参考。 为什么要使用克隆? 在某些情况下,我们需要对一...
二、Python对象拷贝 在Python中,对象的拷贝分为浅拷贝(shallow copy)和深拷贝(deep copy)。 1. 浅拷贝:通过`copy()`函数或`[:]`切片操作创建新对象,只拷贝对象的表面层次。如果原对象包含可变对象(如列表...
在Java编程中,对象拷贝是常见的操作,主要分为两种类型:浅拷贝(Shallow Copy)和深拷贝(Deep Copy)。这两种拷贝方式在处理对象时有着本质的区别,对于理解对象复制机制以及在实际开发中正确地复制复杂对象至关...
### jQuery中的对象拷贝 #### 一、引言 在前端开发中,对象拷贝是一项常用的操作,尤其是在处理数据更新、避免数据污染等场景时。jQuery 提供了一套简便的方法来实现对象拷贝,即 `$.extend()` 方法。本文将详细...