原文网址:http://blog.bd17kaka.net/blog/2013/06/25/java-deep-copy/

JAVA中的浅拷贝和深拷贝(shallow copy and deep copy)

一个示例

首先要区分”copy a value”和”copy an object”之间的区别:

// copy a value
int val   = 1;
int cpVal = val;// copy a value(the object reference for the array above)
int[] val   = new int[]{42};
int[] cpVal = val;// copy a object
StringBuffer object   = new StringBuffer("I am a object");
StringBuffer cpObject = new StringBuffer(object);

简单的说,赋值操作都是”copy a value”。如果想要”copy an object”,需要显式的或者在内部进行类似”new”的操作。

对象(object)的浅拷贝和深拷贝

浅拷贝意味着仅仅拷贝对象的一层,而深拷贝意味着拷贝对象多于一层的数据。那么问题就是,怎么去定义一层?

考虑下面的例子:

public class Example {public int foo;public int[] bar;public Example() { };public Example(int foo, int[] bar) { this.foo = foo; this.bar = bar; };
}Example eg1 = new Example(1, new int[]{1, 2});

下面两个例子分别执行了对eg1的浅拷贝和深拷贝

Example eg2 = new Example(eg1.foo, eg1.bar);
Example eg2 = new Example(eg1.foo, Arrays.copy(eg1.bar));

clone方法

每一个类和array都包含这个方法,它的功能是创建目的对象的一个拷贝,然而要注意以下几点:

  • deep无法确定到底是多少层?两层?三层?还是所有链接的对象
  • 实际上,文档并没有说明clone是否创建一个新的对象

下面是javadoc对于clone的解释:

"Creates and returns a copy of this object.
The precise meaning of "copy"
may depend on the class of the object. The general intent is that, for any object x,
the expression x.clone() != x will be true,
and that
the expression x.clone().getClass() == x.getClass()
will be true,
but these are not absolute requirements. While it is typically the case that
x.clone().equals(x) will be true,
this is not an absolute requirement."

Java List深拷贝实现

使用List的addAll方法就可以deep copy源列表中的所有元素(前提是list内部元素执行浅拷贝即可):

public static void main(String[] args) {List<String> list = new ArrayList<String>();list.add("1");list.add("2");// 创建dest list,将源list的所有值都拷贝过去List<String> dest = new ArrayList<String>();dest.addAll(list);// 在dest list中添加一个元素,修改一个元素dest.add("3");dest.set(0, "2");// 打印两个数组for (String item : list) {System.out.println(item);}System.out.println("--------------------------------");for (String item : dest) {System.out.println(item);}System.out.println("--------------------------------");
}

输出:

1
2
--------------------------------
2
2
3
--------------------------------

参考

Java :deep copy, shallow copy, clone

【转】JAVA中的浅拷贝和深拷贝相关推荐

  1. Java中的浅拷贝与深拷贝

    一.引用拷贝与对象拷贝 class Person implements Cloneable{private String name;private int age;...省略get和set方法 pro ...

  2. js 浅拷贝直接赋值_JS中实现浅拷贝和深拷贝的代码详解

    (一)JS中基本类型和引用类型 JavaScript的变量中包含两种类型的值:基本类型值 和 引用类型值,在内存中的表现形式在于:前者是存储在栈中的一些简单的数据段,后者则是保存在堆内存中的一个对象. ...

  3. Python中的浅拷贝和深拷贝(一看就懂!!!)

    浅拷贝和深拷贝一直傻傻的分不清,甚至有时候会理解反.今天就简单总结一下python中的浅拷贝和深拷贝. 总结 最直观的理解就是: 1.深拷贝,拷贝的程度深,自己新开辟了一块内存,将被拷贝内容全部拷贝过 ...

  4. 详解Java中的clone方法 -- 深拷贝和浅拷贝

    Java中对象的创建 clone顾名思义就是复制, 在Java语言中, clone方法被对象调用,所以会复制对象.所谓的复制对象,首先要分配一个和源对象同样大小的空间,在这个空间中创建一个新的对象.那 ...

  5. java中浅拷贝和深拷贝_java中的浅拷贝和深拷贝

    复制 将一个对象的引用复制给另一个对象,一共有三种方式.第一种方式是直接赋值,第二种方式是浅复制,第三种方式是深复制. 1.直接赋值 在Java中,A a1 = a2,这实际上复制的是引用,也就是说 ...

  6. java深入理解浅拷贝和深拷贝

    文章目录 简介 拷贝接口 使用clone导致的浅拷贝 使用clone的深拷贝 不要overridden clone 总结 简介 拷贝对象是java中经常会遇到的问题.java中存在两种类型,基础类型和 ...

  7. 43 JavaScript中的浅拷贝与深拷贝

    技术交流QQ群:1027579432,欢迎你的加入! 欢迎关注我的微信公众号:CurryCoder的程序人生 1.浅拷贝与深拷贝 浅拷贝只是拷贝一层,更深层次对象级别的只拷贝引用. 深拷贝拷贝多层,每 ...

  8. 说说JS中的浅拷贝与深拷贝

    outline: 为什么要说JS中深拷贝与浅拷贝 JS对类型的分类 immutable与mutable 简单类型检测 浅拷贝VS深拷贝 为什么要说JS中深拷贝与浅拷贝 近来在研读underscore的 ...

  9. C#中的浅拷贝和深拷贝

    C#中有两种类型变量,一种是值类型变量,一种是引用类型变量.对于前者,copy是属于全盘复制:而对于后者,一般的copy只是浅copy,相当于只传递一个引用指针一样.因此对于后者进行真正copy的时候 ...

最新文章

  1. 使用 ThinkJS + Vue.js 开发博客系统
  2. 在ubuntu14.04 64位虚拟机中安装mysql
  3. php nfs,NFS(网络文件系统)服务器简单解析
  4. jasmine没有调用fixture.detectChanges就取不到元素的原因
  5. P2403 [SDOI2010]所驼门王的宝藏
  6. 【渝粤教育】国家开放大学2018年春季 0275-22T内科护理学 参考试题
  7. javax.script.ScriptException: ReferenceError: xxx is not defined in eval
  8. Android抽屉页面效果
  9. Centos7上卸载openJdk安装,安装自己的JDK1.8
  10. Unity3d + UGUI 的多分辨率适配
  11. Java String trim()方法示例
  12. QT练习5:显示GIF图片
  13. 地统计学中的基台值问题
  14. 转:jwgkvsq.vmx手工清除方法(针对病毒变种补充完整)
  15. origin中文版散点图拟合曲线_Origin9绘图时对一组散点图中的不同部分分别进行线性拟合的方法...
  16. pycharm 拼音检查
  17. 怎么锻炼java逻辑思维_托马斯逻辑训练板技高一筹,锻炼编程逻辑思维能力
  18. 麻省理工学院公开课:算法导论
  19. 支付宝付款弹窗 被浏览器拦截
  20. 爬虫120例之第17例,用Python面向对象的思路,采集各种精彩句子

热门文章

  1. LHF Objective-C语法(7)id类型、动态判断与选择器
  2. Private strand flush not complete 说明
  3. duilib list控件扩展
  4. svn 备份和还原项目
  5. 大数据之-Hadoop3.x_MapReduce_自定义outputformat案例完善执行---大数据之hadoop3.x工作笔记0123
  6. 大数据_Hbase-API访问_Java操作Hbase_数据操作_命名空间创建_表创建_表查询---Hbase工作笔记0013
  7. 理解_授权数据模型_Spring Security OAuth2.0认证授权---springcloud工作笔记112
  8. 2011浙大878计算机专业基础综合大题答案解析
  9. JSP页面是否需要重新编译--checkInterval
  10. Linux防火墙端口设置和mysql端口开放的navicat整合