本文属原创,转载请注明出处: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. 解决java使用https协议请求出现证书不信任问题(PKIX path building failed)

    解决https请求时出现pkix path building fail错误 方法 将submail.cer 安全证书导入到java中的cacerts证书库 (sumail是我从https://api. ...

  2. 结对编程--基于android平台的黄金点游戏

    游戏内容: 阿超的课都是下午两点钟,这时班上不少的同学都昏昏欲睡,为了让大家兴奋起来,阿超让同学玩一个叫“黄金点”的游戏: N个同学(N通常大于10),每人写一个0~100之间的有理数 (不包括0或1 ...

  3. Maven最佳实践:Maven仓库(转)

    转自:http://juvenshun.iteye.com/blog/359256 什么是Maven仓库 在不用Maven的时候,比如说以前我们用Ant构建项目,在项目目录下,往往会看到一个名为/li ...

  4. maven3.2.3+eclipse4.4+JDK1.8+win8.1_64bit环境搭建

    --------------------------------------- 博文作者:迦壹 博客标题:win8.1_64bit+eclipse4.4+maven3.2.3+JDK1.8环境搭建 博 ...

  5. java编译期优化

    java语言的编译期其实是一段不确定的操作过程,因为它可以分为三类编译过程: 1.前端编译:把.java文件转变为.class文件 2.后端编译:把字节码转变为机器码 3.静态提前编译:直接把*.ja ...

  6. KO中对象数组排序时,两个属性的优先顺序不一致时的排序实现

    function FromSort(left, right, asc) {    if (left.属性1 != "") {        if (right.属性1 != &qu ...

  7. 以Administrator权限运行VS时无法拖入文件

    解决办法 1.从任务管理器中关闭explorer进程(你会发现任务栏什么的都没有了) 2.从任务管理器启动explorer.exe(win8需要手动勾选"以管理员权限运行",win ...

  8. nodemon配置文件简单整理

    文件名称nodemon.json 内容如下: { "restartable":"rs",//重启的命令,默认是 rs "ignore":[& ...

  9. Oracle用户密码过期后重置SYS用户密码

    问题状况: SYS.SYSTEM用户的密码过期,无法登陆. 运行EM控制台后,出现错误——ORA-28001: the password has expired (DBD ERROR: OCISess ...

  10. rails下自动更新静态文件的gem包

    https://github.com/guard/guard-livereload gemfile group :development do gem 'guard-livereload', '~&g ...