shallow copy 和 deep copy 的示例

时间:2022-01-04 04:26:52

本文属原创,转载请注明出处:http://www.cnblogs.com/robinjava77/p/5481874.html   (Robin)

Student

 1 package base;
2
3 import java.io.Serializable;
4
5 /**
6 * Created by robin on 2016/5/11.
7 *
8 * @author robin
9 */
10 public class Student implements Cloneable,Serializable{
11
12 private String stuId;
13
14 private String name;
15
16 private Integer age;
17
18 public Student(String stuId, String name, Integer age) {
19 this.stuId = stuId;
20 this.name = name;
21 this.age = age;
22 }
23
24 public Student(String stuId, String name) {
25 this.stuId = stuId;
26 this.name = name;
27 }
28
29 public String getStuId() {
30 return stuId;
31 }
32
33 public String getName() {
34 return name;
35 }
36
37 public Integer getAge() {
38 return age;
39 }
40
41 public void setStuId(String stuId) {
42 this.stuId = stuId;
43 }
44
45 public void setName(String name) {
46 this.name = name;
47 }
48
49 public void setAge(Integer age) {
50 this.age = age;
51 }
52 /**
53 * @return 创建并返回此对象的一个副本。
54 * @throws CloneNotSupportedException
55 */
56 public Student clone() throws CloneNotSupportedException {
57 //直接调用父类的clone()方法,返回克隆副本
58 return (Student) super.clone();
59 }
60
61 @Override
62 public String toString(){
63 StringBuffer sb = new StringBuffer();
64 sb.append("[stuId:");
65 sb.append(this.stuId);
66 sb.append(",name:");
67 sb.append(this.name);
68 sb.append(",age:");
69 sb.append(this.age);
70 sb.append("]");
71 return sb.toString();
72 }
73
74 /**
75 * JAVA当中所有的类都是继承于Object这个基类的,在Object中的基类中定义了一个equals的方法,这个方法的初始行为是比较对象的内存地址。
76 * 但在一些类库当中这个方法被覆盖掉了,如String,Integer,Date在这些类当中equals有其自身的实现,而不再是比较类在堆内存中的存放地址了。
77 * 注意:对于复合数据类型之间进行equals比较,在没有覆写equals方法的情况下,他们之间的比较还是基于他们在内存中的存放位置的地址值。
78 * @param student
79 * @return
80 */
81 public boolean equals(Student student){
82 if(this.stuId.equals(student.getStuId()) &&
83 this.age.equals(student.getAge()) &&
84 this.name.equals(student.getName())){
85 return true;
86 }
87 return false;
88 }
89 }

深度拷贝和浅层拷贝的区别代码示例

  1 package base;
2
3 import java.io.*;
4 import java.util.ArrayList;
5 import java.util.List;
6 import java.util.Vector;
7
8 /**
9 * Created by robin on 2016/5/11.
10 *
11 * @author robin
12 */
13 public class ShallowAndDeepCopy {
14
15 private static List<Student> noumenon = new Vector<Student>();
16
17 private static void initPublicNums(){
18 for (int i =0;i < 5;i++){
19 Student newStu = new Student(""+i,"name:"+i,i);
20 noumenon.add(newStu);
21 }
22 }
23
24 public static void main(String args[]) throws CloneNotSupportedException {
25 initPublicNums();
26 List<Student> quote = noumenon;
27 List<Student> shallowCopy = getPublicNumsShallow();
28 List<Student> deepCopy = getPublicNumsDeep();
29 List<Student> deepCommonCopy = deepCopy(noumenon);
30 System.out.println("quote List的内存地址是否相同:"+(noumenon == quote));
31 System.out.println("shallow copy List的内存地址是否相同:"+(noumenon == shallowCopy));
32 System.out.println("deep copy List的内存地址是否相同:" + (noumenon == deepCopy));
33 System.out.println("deepCommon copy List的内存地址是否相同:" + (noumenon == deepCommonCopy));
34 System.out.println("------------------shallow copy test-----------------------");
35 for (int i=0;i<shallowCopy.size();i++){
36 Student shallowStu = shallowCopy.get(i);
37 Student noumenonStu = noumenon.get(i);
38 System.out.println("{shallowStu detail:" + shallowStu.toString()+"}");
39 System.out.println("{noumenonStu detail:" + noumenonStu.toString()+"}");
40 System.out.println("{shallowStu equals noumenonStu:" + shallowStu.equals(noumenonStu)+"}");
41 System.out.println("{shallowCopy("+i+")与noumenon("+i+")内存地址相同:"+(noumenonStu == shallowStu)+"}");
42 System.out.println();
43 }
44 System.out.println("------------------deep copy test-----------------------");
45 for (int i=0;i<deepCopy.size();i++){
46 Student deepStu = deepCopy.get(i);
47 Student noumenonStu = ShallowAndDeepCopy.noumenon.get(i);
48 System.out.println("{deepStu detail:" + deepStu.toString() + "}");
49 System.out.println("{noumenonStu detail:" + noumenonStu.toString() + "}");
50 System.out.println("{deepStu equals noumenonStu:" + deepStu.equals(noumenonStu) + "}");
51 System.out.println("{deepCopy("+i+")与noumenon("+i+")内存地址相同:"+(noumenonStu == deepStu)+"}");
52 System.out.println();
53 }
54 System.out.println("------------------deepCommonCopy copy test-----------------------");
55 for (int i=0;i<deepCommonCopy.size();i++){
56 Student deepCommonStu = deepCommonCopy.get(i);
57 Student noumenonStu = ShallowAndDeepCopy.noumenon.get(i);
58 System.out.println("{deepCommonStu detail:" + deepCommonStu.toString() + "}");
59 System.out.println("{noumenonStu detail:" + noumenonStu.toString() + "}");
60 System.out.println("{deepCommonStu equals noumenonStu:" + deepCommonStu.equals(noumenonStu) + "}");
61 System.out.println("{deepCommonCopy("+i+")与noumenon("+i+")内存地址相同:"+(noumenonStu == deepCommonStu)+"}");
62 System.out.println();
63 }
64 }
65
66 /**
67 * shallow copy:list中 元素引用 仍然是相同的
68 * @return
69 */
70 private static List<Student> getPublicNumsShallow(){
71 List<Student> clone = new ArrayList<Student>(noumenon);
72 return clone;
73 }
74
75 /**
76 * deep copy:list中 引用元素 地址是不同的
77 * @return
78 * @throws CloneNotSupportedException
79 */
80 private static List<Student> getPublicNumsDeep() throws CloneNotSupportedException {
81 List<Student> clone = new ArrayList<Student>();
82 for (int i=0;i< noumenon.size();i++){
83 clone.add(noumenon.get(i).clone());
84 }
85 return clone;
86 }
87
88 /**
89 * 深度复制 这种实现的深度复制,是不需要被复制的元素实现clone方法的 但JDK版本要求:1.7及以上
90 * @param src 这个是同事完成 非本人开发
91 * @return
92 */
93 private static List deepCopy(List src) {
94 List dest = null;
95 ByteArrayInputStream byteIn = null;
96 ObjectInputStream in = null;
97 try (ByteArrayOutputStream byteOut = new ByteArrayOutputStream();
98 ObjectOutputStream out = new ObjectOutputStream(byteOut)) {
99 out.writeObject(src);
100 byteIn = new ByteArrayInputStream(byteOut.toByteArray());
101 in = new ObjectInputStream(byteIn);
102 dest = (List) in.readObject();
103 } catch (IOException | ClassNotFoundException e) {
104 e.printStackTrace();
105 } finally {
106 try {
107 if (in != null) {
108 in.close();
109 }
110 if (byteIn != null) {
111 byteIn.close();
112 }
113 } catch (IOException e) {
114 e.printStackTrace();
115 }
116 }
117 return dest;
118 }
119
120
121 }

执行结果:

 1 quote List的内存地址是否相同:true
2 shallow copy List的内存地址是否相同:false
3 deep copy List的内存地址是否相同:false
4 deepCommon copy List的内存地址是否相同:false
5 ------------------shallow copy test-----------------------
6 {shallowStu detail:[stuId:0,name:name:0,age:0]}
7 {noumenonStu detail:[stuId:0,name:name:0,age:0]}
8 {shallowStu equals noumenonStu:true}
9 {shallowCopy(0)与noumenon(0)内存地址相同:true}
10
11 {shallowStu detail:[stuId:1,name:name:1,age:1]}
12 {noumenonStu detail:[stuId:1,name:name:1,age:1]}
13 {shallowStu equals noumenonStu:true}
14 {shallowCopy(1)与noumenon(1)内存地址相同:true}
15
16 {shallowStu detail:[stuId:2,name:name:2,age:2]}
17 {noumenonStu detail:[stuId:2,name:name:2,age:2]}
18 {shallowStu equals noumenonStu:true}
19 {shallowCopy(2)与noumenon(2)内存地址相同:true}
20
21 {shallowStu detail:[stuId:3,name:name:3,age:3]}
22 {noumenonStu detail:[stuId:3,name:name:3,age:3]}
23 {shallowStu equals noumenonStu:true}
24 {shallowCopy(3)与noumenon(3)内存地址相同:true}
25
26 {shallowStu detail:[stuId:4,name:name:4,age:4]}
27 {noumenonStu detail:[stuId:4,name:name:4,age:4]}
28 {shallowStu equals noumenonStu:true}
29 {shallowCopy(4)与noumenon(4)内存地址相同:true}
30
31 ------------------deep copy test-----------------------
32 {deepStu detail:[stuId:0,name:name:0,age:0]}
33 {noumenonStu detail:[stuId:0,name:name:0,age:0]}
34 {deepStu equals noumenonStu:true}
35 {deepCopy(0)与noumenon(0)内存地址相同:false}
36
37 {deepStu detail:[stuId:1,name:name:1,age:1]}
38 {noumenonStu detail:[stuId:1,name:name:1,age:1]}
39 {deepStu equals noumenonStu:true}
40 {deepCopy(1)与noumenon(1)内存地址相同:false}
41
42 {deepStu detail:[stuId:2,name:name:2,age:2]}
43 {noumenonStu detail:[stuId:2,name:name:2,age:2]}
44 {deepStu equals noumenonStu:true}
45 {deepCopy(2)与noumenon(2)内存地址相同:false}
46
47 {deepStu detail:[stuId:3,name:name:3,age:3]}
48 {noumenonStu detail:[stuId:3,name:name:3,age:3]}
49 {deepStu equals noumenonStu:true}
50 {deepCopy(3)与noumenon(3)内存地址相同:false}
51
52 {deepStu detail:[stuId:4,name:name:4,age:4]}
53 {noumenonStu detail:[stuId:4,name:name:4,age:4]}
54 {deepStu equals noumenonStu:true}
55 {deepCopy(4)与noumenon(4)内存地址相同:false}
56
57 ------------------deepCommonCopy copy test-----------------------
58 {deepCommonStu detail:[stuId:0,name:name:0,age:0]}
59 {noumenonStu detail:[stuId:0,name:name:0,age:0]}
60 {deepCommonStu equals noumenonStu:true}
61 {deepCommonCopy(0)与noumenon(0)内存地址相同:false}
62
63 {deepCommonStu detail:[stuId:1,name:name:1,age:1]}
64 {noumenonStu detail:[stuId:1,name:name:1,age:1]}
65 {deepCommonStu equals noumenonStu:true}
66 {deepCommonCopy(1)与noumenon(1)内存地址相同:false}
67
68 {deepCommonStu detail:[stuId:2,name:name:2,age:2]}
69 {noumenonStu detail:[stuId:2,name:name:2,age:2]}
70 {deepCommonStu equals noumenonStu:true}
71 {deepCommonCopy(2)与noumenon(2)内存地址相同:false}
72
73 {deepCommonStu detail:[stuId:3,name:name:3,age:3]}
74 {noumenonStu detail:[stuId:3,name:name:3,age:3]}
75 {deepCommonStu equals noumenonStu:true}
76 {deepCommonCopy(3)与noumenon(3)内存地址相同:false}
77
78 {deepCommonStu detail:[stuId:4,name:name:4,age:4]}
79 {noumenonStu detail:[stuId:4,name:name:4,age:4]}
80 {deepCommonStu equals noumenonStu:true}
81 {deepCommonCopy(4)与noumenon(4)内存地址相同:false}