java深度克隆
⑴ java,,"浅克隆,只复制一个对象 ,深克隆 对象和引用一起复制"有java实例吗不理解啊
对只包抄含进本类型的类来说袭,无所谓深克隆。但是一个类包含集合类或者复杂的类,就要考虑二者的区别了。
class Student {
private int id;
private Address address;
private ArrayList<Book> bookList;
}
对于以上类的一个对象a和克隆类 o来说:
浅克隆:
a !=o 但是 a.address == o.address, a.bookList == o.bookList
深克隆:
a !=o 但是 a.address != o.address, a.bookList != o.bookList
并且 bookList中的每个元素不是相同对象。
简言之, 浅克隆只复制本对象,深克隆除了本对象,其儿子、孙子、....都要克隆。
以上纯手敲,有错请包涵。
⑵ java如何深度一个object
java深复制的例子:
1、创建Employer类,实现Cloneable接口:
class Employer implements Cloneable{
private String username;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
@Override
public Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
2、创建Employee类,实现Cloneable接口,并改写clone方法,实现深复制:
class Employee implements Cloneable{
private String username;
private Employer employer;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public Employer getEmployer() {
return employer;
}
public void setEmployer(Employer employer) {
this.employer = employer;
}
@Override
public Object clone() throws CloneNotSupportedException {
//克隆Employee对象并手动的进一步克隆Employee对象中包含的Employer对象
Employee employee = (Employee)super.clone();
employee.setEmployer((Employer) employee.getEmployer().clone());
return employee;
}
}
3、这样,在客户端拷贝的两个Employee对象的Employer就互不影响了:
public static void main(String[] args) throws CloneNotSupportedException {
Employer employer = new Employer();
employer.setUsername("arthinking");
Employee employee = new Employee();
employee.setUsername("Jason");
employee.setEmployer(employer);
//employee2由employee深复制得到
Employee employee2 = (Employee) employee.clone();
//这样两个employee各自保存了两个employer
employee2.getEmployer().setUsername("Jason");
System.out.println(employee.getEmployer().getUsername());
System.out.println(employee2.getEmployer().getUsername());
}
⑶ java深度复制问题:
for(int i=0;i<e.children.size();i++){ 这里遍历childen的对象错了,应该是“this.children”,并且要注意是否为空。
Elem temp = (Elem)children.get(i).clone(); 这句已表达是深度复制。
⑷ java bean 如何过滤某些属性进行深度克隆
序列化bean,先写入,后读出。这两个bean 就毫无关系了。但内容一模一样。
publicSerializableObject(Serializablesobj){
try{
ByteArrayOutputStreambos=newByteArrayOutputStream();
ObjectOutputStreamoos=newObjectOutputStream(bos);
oos.writeObject(sobj);
ByteArrayInputStreambis=newByteArrayInputStream(bos.toByteArray());
ObjectInputStreamois=newObjectInputStream(bis);
return(Serializable)ois.readObject();
}catch(Exceptione){
returnnull;
}
}
可以参考一下。不过 要求实现 Serializable接口。
原文:
html">http://tieba..com/p/3205322191
⑸ java深度拷贝和浅度拷贝的问题
看来你并没理解错克隆,反而是改变东西的方法不对。
先还是讲讲克隆吧。
是的,上面的clone方法也就是Object的Clone方法是浅表复制,看看他的API说的:
“此方法会创建此对象的类的一个新实例,并像通过分配那样,严格使用此对象相应字段的内容初始化该对象的所有字段;……。所以,此方法执行的是该对象的“浅表复制”,而不“深层复制”操作。 ”
这你没理解错。
但你测试的方法貌似有问题,让人不知你想干什么。
本来sb1、sb2的a字段内容相同的。这两个字段代表两个对象,所谓俩对象,说白了实际上都是一个4字节空间,存的是StringBuffer对象地址,也就是所谓a对象,实际上包含两个东西,一个是a这个指针(我是在说JAVA),另一个指的是这个指针指向的堆栈里面的空间(再复杂就不说了,参阅《JAVA虚拟机》)。相同也就意味着两个变量指向的对象空间一样。
这样的话,如果你调用sb1.a.put...类似的方法朝a中放东西,那sb2也会变。
可你直接把sb1的a换了,也就是让a指向另一个你new的空间。这样和sb2有什么关系,而且你以后再改sb1的a,sb2也不会变。
不说了,累。不懂就问我。
⑹ java中的浅克隆和深克隆是什么
克隆是指克隆对象,在堆空间复制一块内存,是完全的两个对象,不是指针指向!浅克隆是指克隆一个对象,而该对象的属性只是基本数据类型,只克隆出该对象!深度克隆是指克隆的目标里面还有引用类型,引用类型里还有引用类型,同时把引用类型克隆出来叫深度克隆!常用的方法有两种,第一,需克隆的对象实现cloneable接口;第二,使用commons包提供的克隆方法。这两种方法都能实现深度克隆!
⑺ java中如何实现一个类的深克隆的代码
类的属性如果是引用类型的 那么继续执行属性的 clone方法即可(属性要实现Cloneable接口)
⑻ java深克隆
deep ,自己看:
http://blog.csdn.net/liuchao1211/article/details/3277955
⑼ java 深度复制
House不是单例吧?h1和h2的地址不一样第一个肯定是false.house内部怎么样这个光看这些真难看出。
⑽ java中深克隆与浅克隆的区别
深克隆与浅克隆
大家知道,对象是互相引用的,即对象中可能包含了另一个对象的引用,举例如:有一个Order对象,Order对象中又包含了LineItems对象,然后LineItems对象又包含了Item对象。
好了,现在我有一个Order对象order1,它包含了一个LineItems对象items,这表示的是有一个订单order1,订单的内容是items。
好的,现在有另一个客户想要一份订单,内容跟order1完全一样,那么在系统的逻辑层我们怎么做呢?很简单,order2=order1.clone(). 我们知道clone方法是在内存中生成一个新的对象,而不是只得到原对象的引用。这时候,有人说话了:“哦,明白了我们对order2的成员变量进行修改,是不会影响order1的。” 很可惜,这句话只对了一半。
假设order类有一个成员变量name,当然改变order2.name不会影响order1.name,因为他们在不同的内存区域。但是如果改变 order1.items呢?很遗憾,简单地使用order1.clone,是会影响到order2.items的。原因很简单,就是因为clone方法默认的是浅克隆,即不会克隆对象引用的对象,而只是简单地复制这个引用。所以在上例中,items对象在内存中只有一个,order1和order2都指向它,任何一个对象对它的修改都会影响另一个对象。
那相对浅克隆,深克隆自然就是会克隆对象引用的对象了。也就是说,在上例中,改变order1.items并不会影响order2.items了。因为内存中有两个一样的items。
如果实现深克隆?
一个方法自然是重写clone方法,添加如order.items=(LineItems)items.clone()的语句,也就是人为地添加对引用对象的复制。这个方法的缺点是如果引用对象有很多,或者说引用套引用很多重,那么太麻烦了。业界常用的方法是使用串行化然后反串行化的方法来实现深克隆。由于串行化后,对象写到流中,所有引用的对象都包含进来了,所以反串行化后,对等于生成了一个完全克隆的对象。绝!
这个方法的要求是对象(包括被引用对象)必须事先了Serializable接口,否则就要用transient关键字将其排除在复制过程中。