Java克隆对象
2014-05-12 16:20
351 查看
一。 使用Cloneable接口
实现Cloneable接口的类都具备被拷贝的能力,拷贝在内存中进行,比new生成对象性能明显提升;
clone方法是Object类的protected方法,也就是在用户编写的代码中不能直接调用。为此必须重写定义clone方法,并声明为public,
Cloneable接口的出现与接口正常使用没有关系,是一个空接口,它只是一个标记表示一个对象需要克隆,如果一个对象需要克隆,而没有实现Cloneable接口,就会产生一个(checked
exception)
Clone()方法存在与Object对象中,但是其不会将对象的全部属性都拷贝,而是有选择的拷贝
基本类型:
对象:如果变量是一个实例对象,只拷贝地址引用;
String字符串:拷贝地址引用,但是修改时,会从字符串池中重新生成新的字符串,原来的保持不变;
对于Clone实现对象的拷贝:需要新建大量的对象,工程量大可以使用序列化来实现对象的拷贝
二、使用序列化来实现对象的拷贝
在内存中通过字节流的拷贝是比较容易的,把木对象写入到一个字节流中,再从字节流中毒出来,这样可以创建一个新的对象,且新对象与木对象不存在引用共享的问题,实现的对象的深拷贝
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;
}
}
使用该工具类的对象必须实现Searializable接口,否则无法克隆,
例子:
实现Cloneable接口的类都具备被拷贝的能力,拷贝在内存中进行,比new生成对象性能明显提升;
clone方法是Object类的protected方法,也就是在用户编写的代码中不能直接调用。为此必须重写定义clone方法,并声明为public,
Cloneable接口的出现与接口正常使用没有关系,是一个空接口,它只是一个标记表示一个对象需要克隆,如果一个对象需要克隆,而没有实现Cloneable接口,就会产生一个(checked
exception)
Clone()方法存在与Object对象中,但是其不会将对象的全部属性都拷贝,而是有选择的拷贝
基本类型:
对象:如果变量是一个实例对象,只拷贝地址引用;
String字符串:拷贝地址引用,但是修改时,会从字符串池中重新生成新的字符串,原来的保持不变;
对于Clone实现对象的拷贝:需要新建大量的对象,工程量大可以使用序列化来实现对象的拷贝
//Person.java public class Person implements Cloneable { private String name; public String getName() { return name; } public void setName(String aName) { name = aName; } public Person clone() { Person person = null; try { person = (Person) super.clone(); } catch (CloneNotSupportedException e) { e.printStackTrace(); } return person; } public Person() { } }
public class CloneTest { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub Person a = new Person(); a.setName("yang"); Person b = a.clone(); b.setName("Qiang"); System.out.println("A name :" + a.getName()); } }
二、使用序列化来实现对象的拷贝
在内存中通过字节流的拷贝是比较容易的,把木对象写入到一个字节流中,再从字节流中毒出来,这样可以创建一个新的对象,且新对象与木对象不存在引用共享的问题,实现的对象的深拷贝
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;
}
}
使用该工具类的对象必须实现Searializable接口,否则无法克隆,
例子:
publicclass Email implements Serializable{ } publicclass Client{ publicstatic void main(){ Emailemail = new Email(); Emailcopy = CloneUtils.clone(email); } }
相关文章推荐
- Java设计模式中的创建类模式
- java对象转JSON JS取JSON数据
- JSP和JavaBean
- Java设计模式---原型模式
- Java开发小工具
- 关于java获取当前时间
- statistics-1.0.6.jar下载
- NO.1 在Eclipse中安装Maven插件安装详解
- spring @Resource @Autowired
- java.lang.NoClassDefFoundError: com.robotium.solo.Solo 错误解决
- Java目前最吃香的编程语言
- java定时执行任务
- 菜鸟调错(四)——Spring与DWR集成,配置文件报错
- struts中s:property截取字符串
- synchronized 关键字
- 菜鸟调错(四)——Spring与DWR集成,配置文件报错
- For each循环(简洁而又难理解)
- spring AOP详解三
- spring AOP详解二
- java中serializable是什么