本文属原创,转载请注明出处: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. }

执行结果:

  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}

shallow copy 和 deep copy 的示例的更多相关文章

  1. Shallow copy and Deep copy

    Shallow copy and Deep copy 第一部分: 一.来自wikipidia的解释: Shallow copy One method of copying an object is t ...

  2. python中的shallow copy 与 deep copy

    今天在写代码的时候遇到一个奇葩的问题,问题描述如下: 代码中声明了一个list,将list作为参数传入了function1()中,在function1()中对list进行了del()即删除了一个元素. ...

  3. NumPy学习(索引和切片,合并,分割,copy与deep copy)

    NumPy学习(索引和切片,合并,分割,copy与deep copy) 目录 索引和切片 合并 分割 copy与deep copy 索引和切片 通过索引和切片可以访问以及修改数组元素的值 一维数组 程 ...

  4. copy&mutableCopy 浅拷贝(shallow copy)深拷贝 (deep copy)

    写在前面 其实看了这么多,总结一个结论: 拷贝的初衷的目的就是为了:修改原来的对象不能影响到拷贝出来得对象 && 修改拷贝出来的对象也不能影响到原来的对象 所以,如果原来对象就是imm ...

  5. copy和deep.copy

    https://blog.csdn.net/qq_32907349/article/details/52190796 加上crossin公众号上的可变对象与不可变对象 a=[1,2,3,[4]] b= ...

  6. shallow copy & deep copy

    1.深复制与浅复制的概念 ->浅复制(shallow copy)概念   在SDK Guides中(搜索copy),官方给出的浅复制概念为: Copying compound objects, ...

  7. Summary: Deep Copy vs. Shallow Copy vs. Lazy Copy

    Object copy An object copy is an action in computing where a data object has its attributes copied t ...

  8. Python学习-赋值、浅copy和深copy

    Python Copy: 在Python语言中,分为浅拷贝和深拷贝两种形式,也就是官方文档中的Shadow copy和Deep copy.在对简单的对象(object)进行复制时,两者没有区别,如下面 ...

  9. python deep copy and shallow copy

    Python中对于对象的赋值都是引用,而不是拷贝对象(Assignment statements in Python do not copy objects, they create bindings ...

随机推荐

  1. 在as3中使用protobuf

    在最近参与开发的adobe air项目中,前后端的通信协议从XML.JSON再到protobuf,最后选择protobuf原因,主要是前后端维护protobuf协议就行了,同时还可以利用IDE做一些编 ...

  2. 副本限制修改-M端

    魔兽的副本很多,也有很多副本都有进入的限制,比方说最普遍的,有些副本有级别限制,没达到要求的级别是不能进入对应副本的还有些副本是有任务需求限制,比方说黑翼副本,需要做完一个任务之后才可以进入副本当然, ...

  3. zeromq:c,c++,golang及nodejs使用

    官网:www.zeromq.org 消息队列比较:http://www.cnblogs.com/charlesblc/p/6058799.html zeromq的一些观点:http://www.cnb ...

  4. asp.net mvc4 学习笔记一(基本原理)

    做了8年的asp.net webform,用过MVVM但还没用过MVC , 虽然项目不用MVC,但是还是想了解一下,今天第二天学习,以下是学习心得. VS2012默认带有asp.net mvc3和as ...

  5. Python isinstance() type()

    isinstance(object, classinfo) 判断实例是否是这个类或者object是变量 classinfo 是类型(tuple,dict,int,float,long...)(包括自定 ...

  6. MySql 打开日志文件

    -- 查看系统变量 show variables like '%general%'; set global general_log=on;

  7. DB2 中文排序问题

    本地测试库中 代码集: GBK 数据库配置发行版级别 = 0x0c00 数据库发行版级别 = 0x0c00 数据库地域 = CN 数据库代码页 = 1386 数据库代码集 = GBK 数据库国家/地区 ...

  8. Jquery:hide一个元素,需要注意的问题(offset)

    $(".load_more").css('display','none'); 或 $(that.more).find("strong").hide(); 需要注 ...

  9. ubuntu死机怎么办

    在使用ubuntu的时候由于各种复杂的因素,如软件不兼容,误操作等问题导致"死机"怎么办呢?下面我们来看看如何解决这问题...   可以打开终端模拟器   1 ctrl+alt+t ...

  10. TCP和UDP之间的区别和联系

    面向连接的TCP TCP(Transmission Control Protocol,传输控制协议)是基于连接的协议,也就是说,在正式收发数据前,必须和对方建立可靠的连接.一个TCP连接必须要经过三次 ...