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

Student

 package base;

 import java.io.Serializable;

 /**
* Created by robin on 2016/5/11.
*
* @author robin
*/
public class Student implements Cloneable,Serializable{ private String stuId; private String name; private Integer age; public Student(String stuId, String name, Integer age) {
this.stuId = stuId;
this.name = name;
this.age = age;
} public Student(String stuId, String name) {
this.stuId = stuId;
this.name = name;
} public String getStuId() {
return stuId;
} public String getName() {
return name;
} public Integer getAge() {
return age;
} public void setStuId(String stuId) {
this.stuId = stuId;
} public void setName(String name) {
this.name = name;
} public void setAge(Integer age) {
this.age = age;
}
/**
* @return 创建并返回此对象的一个副本。
* @throws CloneNotSupportedException
*/
public Student clone() throws CloneNotSupportedException {
//直接调用父类的clone()方法,返回克隆副本
return (Student) super.clone();
} @Override
public String toString(){
StringBuffer sb = new StringBuffer();
sb.append("[stuId:");
sb.append(this.stuId);
sb.append(",name:");
sb.append(this.name);
sb.append(",age:");
sb.append(this.age);
sb.append("]");
return sb.toString();
} /**
* JAVA当中所有的类都是继承于Object这个基类的,在Object中的基类中定义了一个equals的方法,这个方法的初始行为是比较对象的内存地址。
* 但在一些类库当中这个方法被覆盖掉了,如String,Integer,Date在这些类当中equals有其自身的实现,而不再是比较类在堆内存中的存放地址了。
* 注意:对于复合数据类型之间进行equals比较,在没有覆写equals方法的情况下,他们之间的比较还是基于他们在内存中的存放位置的地址值。
* @param student
* @return
*/
public boolean equals(Student student){
if(this.stuId.equals(student.getStuId()) &&
this.age.equals(student.getAge()) &&
this.name.equals(student.getName())){
return true;
}
return false;
}
}

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

 package base;

 import java.io.*;
import java.util.ArrayList;
import java.util.List;
import java.util.Vector; /**
* Created by robin on 2016/5/11.
*
* @author robin
*/
public class ShallowAndDeepCopy { private static List<Student> noumenon = new Vector<Student>(); private static void initPublicNums(){
for (int i =0;i < 5;i++){
Student newStu = new Student(""+i,"name:"+i,i);
noumenon.add(newStu);
}
} public static void main(String args[]) throws CloneNotSupportedException {
initPublicNums();
List<Student> quote = noumenon;
List<Student> shallowCopy = getPublicNumsShallow();
List<Student> deepCopy = getPublicNumsDeep();
List<Student> deepCommonCopy = deepCopy(noumenon);
System.out.println("quote List的内存地址是否相同:"+(noumenon == quote));
System.out.println("shallow copy List的内存地址是否相同:"+(noumenon == shallowCopy));
System.out.println("deep copy List的内存地址是否相同:" + (noumenon == deepCopy));
System.out.println("deepCommon copy List的内存地址是否相同:" + (noumenon == deepCommonCopy));
System.out.println("------------------shallow copy test-----------------------");
for (int i=0;i<shallowCopy.size();i++){
Student shallowStu = shallowCopy.get(i);
Student noumenonStu = noumenon.get(i);
System.out.println("{shallowStu detail:" + shallowStu.toString()+"}");
System.out.println("{noumenonStu detail:" + noumenonStu.toString()+"}");
System.out.println("{shallowStu equals noumenonStu:" + shallowStu.equals(noumenonStu)+"}");
System.out.println("{shallowCopy("+i+")与noumenon("+i+")内存地址相同:"+(noumenonStu == shallowStu)+"}");
System.out.println();
}
System.out.println("------------------deep copy test-----------------------");
for (int i=0;i<deepCopy.size();i++){
Student deepStu = deepCopy.get(i);
Student noumenonStu = ShallowAndDeepCopy.noumenon.get(i);
System.out.println("{deepStu detail:" + deepStu.toString() + "}");
System.out.println("{noumenonStu detail:" + noumenonStu.toString() + "}");
System.out.println("{deepStu equals noumenonStu:" + deepStu.equals(noumenonStu) + "}");
System.out.println("{deepCopy("+i+")与noumenon("+i+")内存地址相同:"+(noumenonStu == deepStu)+"}");
System.out.println();
}
System.out.println("------------------deepCommonCopy copy test-----------------------");
for (int i=0;i<deepCommonCopy.size();i++){
Student deepCommonStu = deepCommonCopy.get(i);
Student noumenonStu = ShallowAndDeepCopy.noumenon.get(i);
System.out.println("{deepCommonStu detail:" + deepCommonStu.toString() + "}");
System.out.println("{noumenonStu detail:" + noumenonStu.toString() + "}");
System.out.println("{deepCommonStu equals noumenonStu:" + deepCommonStu.equals(noumenonStu) + "}");
System.out.println("{deepCommonCopy("+i+")与noumenon("+i+")内存地址相同:"+(noumenonStu == deepCommonStu)+"}");
System.out.println();
}
} /**
* shallow copy:list中 元素引用 仍然是相同的
* @return
*/
private static List<Student> getPublicNumsShallow(){
List<Student> clone = new ArrayList<Student>(noumenon);
return clone;
} /**
* deep copy:list中 引用元素 地址是不同的
* @return
* @throws CloneNotSupportedException
*/
private static List<Student> getPublicNumsDeep() throws CloneNotSupportedException {
List<Student> clone = new ArrayList<Student>();
for (int i=0;i< noumenon.size();i++){
clone.add(noumenon.get(i).clone());
}
return clone;
} /**
* 深度复制 这种实现的深度复制,是不需要被复制的元素实现clone方法的 但JDK版本要求:1.7及以上
* @param src 这个是同事完成 非本人开发
* @return
*/
private static List deepCopy(List src) {
List dest = null;
ByteArrayInputStream byteIn = null;
ObjectInputStream in = null;
try (ByteArrayOutputStream byteOut = new ByteArrayOutputStream();
ObjectOutputStream out = new ObjectOutputStream(byteOut)) {
out.writeObject(src);
byteIn = new ByteArrayInputStream(byteOut.toByteArray());
in = new ObjectInputStream(byteIn);
dest = (List) in.readObject();
} catch (IOException | ClassNotFoundException e) {
e.printStackTrace();
} finally {
try {
if (in != null) {
in.close();
}
if (byteIn != null) {
byteIn.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
return dest;
} }

执行结果:

 quote List的内存地址是否相同:true
shallow copy List的内存地址是否相同:false
deep copy List的内存地址是否相同:false
deepCommon copy List的内存地址是否相同:false
------------------shallow copy test-----------------------
{shallowStu detail:[stuId:0,name:name:0,age:0]}
{noumenonStu detail:[stuId:0,name:name:0,age:0]}
{shallowStu equals noumenonStu:true}
{shallowCopy(0)与noumenon(0)内存地址相同:true} {shallowStu detail:[stuId:1,name:name:1,age:1]}
{noumenonStu detail:[stuId:1,name:name:1,age:1]}
{shallowStu equals noumenonStu:true}
{shallowCopy(1)与noumenon(1)内存地址相同:true} {shallowStu detail:[stuId:2,name:name:2,age:2]}
{noumenonStu detail:[stuId:2,name:name:2,age:2]}
{shallowStu equals noumenonStu:true}
{shallowCopy(2)与noumenon(2)内存地址相同:true} {shallowStu detail:[stuId:3,name:name:3,age:3]}
{noumenonStu detail:[stuId:3,name:name:3,age:3]}
{shallowStu equals noumenonStu:true}
{shallowCopy(3)与noumenon(3)内存地址相同:true} {shallowStu detail:[stuId:4,name:name:4,age:4]}
{noumenonStu detail:[stuId:4,name:name:4,age:4]}
{shallowStu equals noumenonStu:true}
{shallowCopy(4)与noumenon(4)内存地址相同:true} ------------------deep copy test-----------------------
{deepStu detail:[stuId:0,name:name:0,age:0]}
{noumenonStu detail:[stuId:0,name:name:0,age:0]}
{deepStu equals noumenonStu:true}
{deepCopy(0)与noumenon(0)内存地址相同:false} {deepStu detail:[stuId:1,name:name:1,age:1]}
{noumenonStu detail:[stuId:1,name:name:1,age:1]}
{deepStu equals noumenonStu:true}
{deepCopy(1)与noumenon(1)内存地址相同:false} {deepStu detail:[stuId:2,name:name:2,age:2]}
{noumenonStu detail:[stuId:2,name:name:2,age:2]}
{deepStu equals noumenonStu:true}
{deepCopy(2)与noumenon(2)内存地址相同:false} {deepStu detail:[stuId:3,name:name:3,age:3]}
{noumenonStu detail:[stuId:3,name:name:3,age:3]}
{deepStu equals noumenonStu:true}
{deepCopy(3)与noumenon(3)内存地址相同:false} {deepStu detail:[stuId:4,name:name:4,age:4]}
{noumenonStu detail:[stuId:4,name:name:4,age:4]}
{deepStu equals noumenonStu:true}
{deepCopy(4)与noumenon(4)内存地址相同:false} ------------------deepCommonCopy copy test-----------------------
{deepCommonStu detail:[stuId:0,name:name:0,age:0]}
{noumenonStu detail:[stuId:0,name:name:0,age:0]}
{deepCommonStu equals noumenonStu:true}
{deepCommonCopy(0)与noumenon(0)内存地址相同:false} {deepCommonStu detail:[stuId:1,name:name:1,age:1]}
{noumenonStu detail:[stuId:1,name:name:1,age:1]}
{deepCommonStu equals noumenonStu:true}
{deepCommonCopy(1)与noumenon(1)内存地址相同:false} {deepCommonStu detail:[stuId:2,name:name:2,age:2]}
{noumenonStu detail:[stuId:2,name:name:2,age:2]}
{deepCommonStu equals noumenonStu:true}
{deepCommonCopy(2)与noumenon(2)内存地址相同:false} {deepCommonStu detail:[stuId:3,name:name:3,age:3]}
{noumenonStu detail:[stuId:3,name:name:3,age:3]}
{deepCommonStu equals noumenonStu:true}
{deepCommonCopy(3)与noumenon(3)内存地址相同:false} {deepCommonStu detail:[stuId:4,name:name:4,age:4]}
{noumenonStu detail:[stuId:4,name:name:4,age:4]}
{deepCommonStu equals noumenonStu:true}
{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. Kali Linux 2.0配置并安装常用的工具

    Kali Linux 前身是著名渗透测试系统BackTrack ,是一个基于 Debian 的 Linux 发行版,包含很多安全和取证方面的相关工具. Kali Linux 2.0是基于Debian ...

  2. python 调用浏览器方法

    每天都要登陆某网站,刷积分.为了节省时间,用了下python中的webbrowser模块.新建.py 文件 #!/usr/bin/python import webbrowser webbrowser ...

  3. relocation 错误

    icc test/train/test_lm2.o -shared -lpthread -ldl ./lib/liblm2.a -o liblm2.so ld: ./lib/liblm2.a(cJSO ...

  4. 转载:bootstrap, boosting, bagging 几种方法的联系

    转:http://blog.csdn.net/jlei_apple/article/details/8168856 这两天在看关于boosting算法时,看到一篇不错的文章讲bootstrap, ja ...

  5. LoadRunner简介

    LoadRunner是什么 LoadRunner是一个性能测试工具,它最初是Mercury公司的产品,后背HP收购. LoadRunner常用来做什么 l 验证某系统在某环境下是否满足性能需求. l  ...

  6. Oracle 11.2.0.1的一个Bug,客户端报ORA-03113: 通信通道的文件结尾

    半小时前,一个项目反馈应用系统部分功能报错,ORA-03113: 通信通道的文件结尾.好像是个常见的错误. 异常信息:ORA-03113: 通信通道的文件结尾 进程 ID: 2392 会话 ID: 2 ...

  7. python virtualenv 安装运行saltstack

    需求产生场景:      1.python的virtualenv虚拟环境非常的好用.      2.saltstack作为运维自动化的一个重要组件也挺好用的. 但是:      1.saltsatck ...

  8. JS跨域解决iframe高度自适应(IE8/Firefox/Chrome适用)

    参考园友的js跨越实现,有提到三种方式: 1. 中间页代理方式,利用iframe的location.hash 参见:http://www.5icool.org/a/201203/a1129.html ...

  9. LeetCode "Is Subsequence"

    There are 3 possible approaches: DP, divide&conquer and greedy. And apparently, DP has O(n^2) co ...

  10. bzoj4730: Alice和Bob又在玩游戏

    Description Alice和Bob在玩游戏.有n个节点,m条边(0<=m<=n-1),构成若干棵有根树,每棵树的根节点是该连通块内编号最 小的点.Alice和Bob轮流操作,每回合 ...