Java 浅克隆与深克隆
来源:互联网 发布:刚开始做淘宝卖什么好 编辑:程序博客网 时间:2024/05/18 01:13
有一次,在写一个项目
// for (DateReportBean d : lists) {// System.out.println(d.toString());// }// System.out.println("==========================" + lists.size()); for (DateReportBean d : lists) { // 门店数组 boolean is_add = true; for (String s : shops) { if ( d.getShopName().equals( s)) { is_add = false; } } if ( is_add) { shops.add( d.getShopName()); } // 套餐数组 is_add = true; for (String g : goods) { if ( d.getGoodName().equals( g)) { is_add = false; } } if ( is_add) { goods.add( d.getGoodName()); } // 列表数组 is_add = true; for (DateReportBean dT : listT) { if ( d.getGoodName().equals( dT.getGoodName()) && d.getShopName().equals( dT.getShopName())) { is_add = false; dT.setNum( dT.getNum() + d.getNum()); System. out .println( dT.getShopName() + " " + dT .getGoodName() + " " + dT .getNum() + " " + d .getNum()); dT.setPrice( dT.getPrice() + d.getPrice()); } } if ( is_add) { listT.add( d); } }// for (DateReportBean d : lists) {// System.out.println(d.toString());// }// System.out.println("==========================" + lists.size());
今天写的代码 lists 没有经过 变值,但两次输出结果却不同。
后来仔细一想,原因:
listT.add( d);主要是这行代码,lists listT 共用了同一个对象,
当listT内部对象变值时,lists的对象也跟着变化
list是一堆指针链,要 复制对象,而原来的list不受影响,只好用克隆。
克隆测试:
package com.test;import java.io.Serializable;public class Student implements Serializable{ private String name = null; public String getName() { return name; } public void setName(String name) { this. name = name; }}
package com.test;import java.io.ByteArrayInputStream;import java.io.ByteArrayOutputStream;import java.io.IOException;import java.io.ObjectInputStream;import java.io.ObjectOutputStream;import java.io.Serializable;public class Teacher implements Cloneable ,Serializable{ private Student stu = null; private String str = null; /** *浅克隆 */ public Object Clone(){ try { return super.clone(); } catch (CloneNotSupportedException e) { // TODO Auto-generated catch block return null; } } /** * 深克隆 */ public Object deepClone() throws IOException, ClassNotFoundException{ ByteArrayOutputStream bOut = new ByteArrayOutputStream(); ObjectOutputStream oOut = new ObjectOutputStream(bOut); oOut.writeObject(this); ByteArrayInputStream bIn = new ByteArrayInputStream(bOut.toByteArray()); ObjectInputStream oIn = new ObjectInputStream(bIn); return oIn.readObject(); } public Student getStu() { return stu; } public void setStu(Student stu) { this.stu = stu; } public String getStr() { return str; } public void setStr(String str) { this.str = str; }}
package com.test;import java.io.IOException;public class Test { public static void main(String[] args) throws ClassNotFoundException, IOException { //实现Teacher对象,并赋值 Student s = new Student(); s.setName( "zhangsan"); Teacher t01 = new Teacher(); t01.setStu( s); t01.setStr( "123"); System. out.println( "------------------>进行浅克隆" ); //浅克隆 --->只能对基本类型克隆 Teacher t02 = (Teacher) t01.Clone(); System. out.println( t01.getStr().hashCode() == t02.getStr().hashCode()); //原因吗,编程思想 t02.setStr( "123456"); System. out.println( t01.getStr()); System. out.println( t01.getStu().hashCode() == t02.getStu().hashCode()); t02.getStu().setName( "lisi"); System. out.println( t01.getStu().getName()); System. out.println( "------------------>进行深克隆" ); //深度克隆 ---> 可对非基本类型克隆 Teacher t03 = (Teacher) t01.deepClone(); System. out.println( t01.getStr().hashCode() == t03.getStr().hashCode()); //原因吗,编程思想 t03.setStr( "123456789"); System. out.println( t01.getStr()); System. out.println( t01.getStu().hashCode() == t03.getStu().hashCode()); t03.getStu().setName( "wangwu"); System. out.println( t01.getStu().getName()); }}
⑴浅复制(浅克隆)
被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用仍然指向原来的对象。换言之,浅复制仅仅复制所考虑的对象,而不
复制它所引用的对象。
⑵深复制(深克隆)
被复制对象的所有变量都含有与原来的对象相同的值,除去那些引用其他对象的变量。那些引用其他对象的变量将指向被复制过的新对象,而不再是原
有的那些被引用的对象。换言之,深复制把要复制的对象所引用的对象都复制了一遍。
0 0
- java 深克隆与浅克隆
- java 深克隆与浅克隆 .
- java 浅克隆与深克隆
- java 浅克隆与深克隆
- java的深克隆与浅克隆
- Java深克隆与浅克隆
- java浅克隆与深克隆
- java浅克隆与深克隆
- java 中浅克隆与深克隆
- java深克隆与浅克隆
- Java的浅克隆与深克隆
- Java 浅克隆与深克隆
- Java的深克隆与浅克隆
- java深克隆与浅克隆
- java深克隆与浅克隆
- JAVA深克隆与浅克隆1
- java浅克隆与深克隆
- java浅克隆与深克隆
- Linux网络编程中服务端判断客户端断开连接。
- Baskets of Gold Coins
- 前端学习笔记-9月--基本布局
- HDOJ 1009
- hdu acm 1114 Piggy-Bank
- Java 浅克隆与深克隆
- Centos7 安装kilo报错 “has no endpoint in ! Available endpoints for this service”
- 个人开源项目 第三方Git@OSC客户端
- socket,http,tcp区别
- 图像滤镜艺术---(Instagram)1977滤镜
- [安全]DDOS攻击[分布式拒绝服务攻击]
- html css 图片居中
- (标记)深入理解javascript作用域和闭包
- win10配置java环境变量,解决javac不是内部或外部命令等问题