Java集合引用传递问题(集合的浅复制和深复制)
2018-01-09 19:32
344 查看
浅复制
实体类
package com.ahut.entity; import java.io.Serializable; import java.util.Date; /** * * @ClassName: Demo * @Description: * @author cheng * @date 2017年11月21日 下午8:32:59 */ public class Demo implements Serializable { /** * 序列化 */ private static final long serialVersionUID = 4122974131420281791L; private String id; private String userName; private int age; private Date birthDay; public Demo() { super(); // TODO Auto-generated constructor stub } @Override public String toString() { return "Demo [birthDay=" + birthDay + ", userName=" + userName + ", age=" + age + ", id=" + id + "]"; } public String getId() { return id; } public void setId(String id) { this.id = id; } public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public Date getBirthDay() { return birthDay; } public void setBirthDay(Date birthDay) { this.birthDay = birthDay; } }
集合测试
/** * * @Title: testCollection * @Description: */ @Test public void testCollection(){ // 创建元素1 Demo demo1 = new Demo(); demo1.setId("1234"); demo1.setUserName("demo1"); demo1.setAge(20); demo1.setBirthDay(new Date()); // 创建元素2 Demo demo2 = new Demo(); demo2.setId("5678"); demo2.setUserName("demo2"); demo2.setAge(40); demo2.setBirthDay(new Date()); // 将元素添加到list1中 List<Demo> demoList1 = new ArrayList<>(); demoList1.add(demo1); demoList1.add(demo2); // 使用list1作为参数,创建list2 List<Demo> demoList2 = new ArrayList<>(demoList1); System.out.println("demoList1===================================="); for(Demo demo : demoList1){ System.out.println(demo); } System.out.println("demoList2===================================="); for(Demo demo : demoList2){ System.out.println(demo); } 输出如下: demoList1==================================== Demo [birthDay=Tue Jan 09 14:29:21 CST 2018, userName=demo1, age=20, id=1234] Demo [birthDay=Tue Jan 09 14:29:21 CST 2018, userName=demo2, age=40, id=5678] demoList2==================================== Demo [birthDay=Tue Jan 09 14:29:21 CST 2018, userName=demo1, age=20, id=1234] Demo [birthDay=Tue Jan 09 14:29:21 CST 2018, userName=demo2, age=40, id=5678] // 取出list2中的元素并修改其属性,发现list1中的元素也发生了改变 Demo demo3 = demoList2.get(0); demo3.setAge(9999); System.out.println("demoList1===================================="); for(Demo demo : demoList1){ System.out.println(demo); } System.out.println("demoList2===================================="); for(Demo demo : demoList2){ System.out.println(demo); } 输出如下: demoList1==================================== Demo [birthDay=Tue Jan 09 14:29:21 CST 2018, userName=demo1, age=9999, id=1234] Demo [birthDay=Tue Jan 09 14:29:21 CST 2018, userName=demo2, age=40, id=5678] demoList2==================================== Demo [birthDay=Tue Jan 09 14:29:21 CST 2018, userName=demo1, age=< 11e0a span class="hljs-number">9999, id=1234] Demo [birthDay=Tue Jan 09 14:29:21 CST 2018, userName=demo2, age=40, id=5678] // 删除list2中的元素,list1不发生改变 demoList2.remove(0); System.out.println("demoList1===================================="); for(Demo demo : demoList1){ System.out.println(demo); } System.out.println("demoList2===================================="); for(Demo demo : demoList2){ System.out.println(demo); } 输出结果: demoList1==================================== Demo [birthDay=Tue Jan 09 14:29:21 CST 2018, userName=demo1, age=9999, id=1234] Demo [birthDay=Tue Jan 09 14:29:21 CST 2018, userName=demo2, age=40, id=5678] demoList2==================================== Demo [birthDay=Tue Jan 09 14:29:21 CST 2018, userName=demo2, age=40, id=5678] // 取出list2中剩下的元素并修改其属性,发现list1中的元素也发生了改变 Demo demo4 = demoList2.get(0); demo4.setAge(6666); System.out.println("demoList1===================================="); for(Demo demo : demoList1){ System.out.println(demo); } System.out.println("demoList2===================================="); for(Demo demo : demoList2){ System.out.println(demo); } 输出结果: demoList1==================================== Demo [birthDay=Tue Jan 09 14:29:21 CST 2018, userName=demo1, age=9999, id=1234] Demo [birthDay=Tue Jan 09 14:29:21 CST 2018, userName=demo2, age=6666, id=5678] demoList2==================================== Demo [birthDay=Tue Jan 09 14:29:21 CST 2018, userName=demo2, age=6666, id=5678] }
内存分析
拷贝list中的对象是一致的,而list是2个对象
改变其中一个list,另一个list不改变
改变list内的一个对象,另一个也改变
List中ArrayList的本质还是数组,本质上区别在于是同一个数组,还是不同的数组。对于其中的对象存储的都是实例的地址,改变影响在所难免。
深复制
实体类
实现Cloneable 接口,重写clone方法注意:虽然Object中就有clone方法,但想要实现clone方法的实体类必须实现Cloneable 接口,否则实体类在调用clone方法时,会抛出异常
package com.ahut.entity; import java.io.Serializable; import java.util.Date; /** * * @ClassName: Demo * @Description: * @author cheng * @date 2017年11月21日 下午8:32:59 */ public class Demo implements Serializable,Cloneable { /** * 序列化 */ private static final long serialVersionUID = 4122974131420281791L; private String id; private String userName; private int age; private Date birthDay; public Demo() { super(); // TODO Auto-generated constructor stub } @Override public String toString() { return "Demo [birthDay=" + birthDay + ", userName=" + userName + ", age=" + age + ", id=" + id + "]"; } /** * 重写clone方法 */ @Override public Demo clone() throws CloneNotSupportedException { return (Demo)super.clone(); } public String getId() { return id; } public void setId(String id) { this.id = id; } public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public Date getBirthDay() { return birthDay; } public void setBirthDay(Date birthDay) { this.birthDay = birthDay; } }
集合测试
/** * * @throws CloneNotSupportedException * @Title: testCollection * @Description: */ @Test public void testCollection() throws CloneNotSupportedException{ Demo demo1 = new Demo(); demo1.setId("1234"); demo1.setUserName("demo1"); demo1.setAge(20); demo1.setBirthDay(new Date()); Demo demo2 = new Demo(); demo2.setId("5678"); demo2.setUserName("demo2"); demo2.setAge(40); demo2.setBirthDay(new Date()); List<Demo> demoList1 = new ArrayList<>(); demoList1.add(demo1); demoList1.add(demo2); // 集合深复制 List<Demo> demoList2 = new ArrayList<>(); for(Demo demo : demoList1){ demoList2.add(demo.clone()); } System.out.println("demoList1===================================="); for(Demo demo : demoList1){ System.out.println(demo); } System.out.println("demoList2===================================="); for(Demo demo : demoList2){ System.out.println(demo); } Demo demo3 = demoList2.get(0); demo3.setAge(9999); System.out.println("demoList1===================================="); for(Demo demo : demoList1){ System.out.println(demo); } System.out.println("demoList2===================================="); for(Demo demo : demoList2){ System.out.println(demo); } demoList2.remove(0); System.out.println("demoList1===================================="); for(Demo demo : demoList1){ System.out.println(demo); } System.out.println("demoList2===================================="); for(Demo demo : demoList2){ System.out.println(demo); } Demo demo4 = demoList2.get(0); demo4.setAge(6666); System.out.println("demoList1===================================="); for(Demo demo : demoList1){ System.out.println(demo); } System.out.println("demoList2===================================="); for(Demo demo : demoList2){ System.out.println(demo); } }
结果
list1和list2操作互不干扰demoList1==================================== Demo [birthDay=Tue Jan 09 21:00:03 CST 2018, userName=demo1, age=20, id=1234] Demo [birthDay=Tue Jan 09 21:00:03 CST 2018, userName=demo2, age=40, id=5678] demoList2==================================== Demo [birthDay=Tue Jan 09 21:00:03 CST 2018, userName=demo1, age=20, id=1234] Demo [birthDay=Tue Jan 09 21:00:03 CST 2018, userName=demo2, age=40, id=5678] demoList1==================================== Demo [birthDay=Tue Jan 09 21:00:03 CST 2018, userName=demo1, age=20, id=1234] Demo [birthDay=Tue Jan 09 21:00:03 CST 2018, userName=demo2, age=40, id=5678] demoList2==================================== Demo [birthDay=Tue Jan 09 21:00:03 CST 2018, userName=demo1, age=9999, id=1234] Demo [birthDay=Tue Jan 09 21:00:03 CST 2018, userName=demo2, age=40, id=5678] demoList1==================================== Demo [birthDay=Tue Jan 09 21:00:03 CST 2018, userName=demo1, age=20, id=1234] Demo [birthDay=Tue Jan 09 21:00:03 CST 2018, userName=demo2, age=40, id=5678] demoList2==================================== Demo [birthDay=Tue Jan 09 21:00:03 CST 2018, userName=demo2, age=40, id=5678] demoList1==================================== Demo [birthDay=Tue Jan 09 21:00:03 CST 2018, userName=demo1, age=20, id=1234] Demo [birthDay=Tue Jan 09 21:00:03 CST 2018, userName=demo2, age=40, id=5678] demoList2==================================== Demo [birthDay=Tue Jan 09 21:00:03 CST 2018, userName=demo2, age=6666, id=5678]
相关文章推荐
- Java参数传递过程中 传形参和传引用问题讨论
- Java值传递和引用传递的问题
- python对象的复制问题,按值传递?引用传递?
- 关于java中是引用传递还是值传递的问题!!!经常在笔试中遇到,今天终于弄明白了!
- 关于Java中按值传递和按引用传递的问题详解
- Java 泛型 集合引用赋值问题(或方法传参)
- java中关于参数传递问题的解释(传值与传引用的若干问题的解释)
- Java--传参的值传递和引用传递问题
- Java传参的值传递和引用传递问题(转)
- 【Stackoverflow好问题】Java是按值传递还是按引用传递
- java程序中参数值传递与引用传递问题
- java 中值传递与引用传递以及方法中别名的问题
- Java中函数参数的值传递与引用传递问题
- Java方法中引用类型的形参传递问题
- Java中值传递和引用传递问题
- Java中传参的值传递和引用传递问题(转)
- Java传参的值传递和引用传递问题(转)
- java中按值传递和按引用传递问题
- JAVA中参数传递问题的总结(按值传递和引用传递)
- java值 与引用的传递问题