【转】JAVA中的浅拷贝和深拷贝
原文网址: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中的浅拷贝和深拷贝相关推荐
- Java中的浅拷贝与深拷贝
一.引用拷贝与对象拷贝 class Person implements Cloneable{private String name;private int age;...省略get和set方法 pro ...
- js 浅拷贝直接赋值_JS中实现浅拷贝和深拷贝的代码详解
(一)JS中基本类型和引用类型 JavaScript的变量中包含两种类型的值:基本类型值 和 引用类型值,在内存中的表现形式在于:前者是存储在栈中的一些简单的数据段,后者则是保存在堆内存中的一个对象. ...
- Python中的浅拷贝和深拷贝(一看就懂!!!)
浅拷贝和深拷贝一直傻傻的分不清,甚至有时候会理解反.今天就简单总结一下python中的浅拷贝和深拷贝. 总结 最直观的理解就是: 1.深拷贝,拷贝的程度深,自己新开辟了一块内存,将被拷贝内容全部拷贝过 ...
- 详解Java中的clone方法 -- 深拷贝和浅拷贝
Java中对象的创建 clone顾名思义就是复制, 在Java语言中, clone方法被对象调用,所以会复制对象.所谓的复制对象,首先要分配一个和源对象同样大小的空间,在这个空间中创建一个新的对象.那 ...
- java中浅拷贝和深拷贝_java中的浅拷贝和深拷贝
复制 将一个对象的引用复制给另一个对象,一共有三种方式.第一种方式是直接赋值,第二种方式是浅复制,第三种方式是深复制. 1.直接赋值 在Java中,A a1 = a2,这实际上复制的是引用,也就是说 ...
- java深入理解浅拷贝和深拷贝
文章目录 简介 拷贝接口 使用clone导致的浅拷贝 使用clone的深拷贝 不要overridden clone 总结 简介 拷贝对象是java中经常会遇到的问题.java中存在两种类型,基础类型和 ...
- 43 JavaScript中的浅拷贝与深拷贝
技术交流QQ群:1027579432,欢迎你的加入! 欢迎关注我的微信公众号:CurryCoder的程序人生 1.浅拷贝与深拷贝 浅拷贝只是拷贝一层,更深层次对象级别的只拷贝引用. 深拷贝拷贝多层,每 ...
- 说说JS中的浅拷贝与深拷贝
outline: 为什么要说JS中深拷贝与浅拷贝 JS对类型的分类 immutable与mutable 简单类型检测 浅拷贝VS深拷贝 为什么要说JS中深拷贝与浅拷贝 近来在研读underscore的 ...
- C#中的浅拷贝和深拷贝
C#中有两种类型变量,一种是值类型变量,一种是引用类型变量.对于前者,copy是属于全盘复制:而对于后者,一般的copy只是浅copy,相当于只传递一个引用指针一样.因此对于后者进行真正copy的时候 ...
最新文章
- 使用 ThinkJS + Vue.js 开发博客系统
- 在ubuntu14.04 64位虚拟机中安装mysql
- php nfs,NFS(网络文件系统)服务器简单解析
- jasmine没有调用fixture.detectChanges就取不到元素的原因
- P2403 [SDOI2010]所驼门王的宝藏
- 【渝粤教育】国家开放大学2018年春季 0275-22T内科护理学 参考试题
- javax.script.ScriptException: ReferenceError: xxx is not defined in eval
- Android抽屉页面效果
- Centos7上卸载openJdk安装,安装自己的JDK1.8
- Unity3d + UGUI 的多分辨率适配
- Java String trim()方法示例
- QT练习5:显示GIF图片
- 地统计学中的基台值问题
- 转:jwgkvsq.vmx手工清除方法(针对病毒变种补充完整)
- origin中文版散点图拟合曲线_Origin9绘图时对一组散点图中的不同部分分别进行线性拟合的方法...
- pycharm 拼音检查
- 怎么锻炼java逻辑思维_托马斯逻辑训练板技高一筹,锻炼编程逻辑思维能力
- 麻省理工学院公开课:算法导论
- 支付宝付款弹窗 被浏览器拦截
- 爬虫120例之第17例,用Python面向对象的思路,采集各种精彩句子
热门文章
- LHF Objective-C语法(7)id类型、动态判断与选择器
- Private strand flush not complete 说明
- duilib list控件扩展
- svn 备份和还原项目
- 大数据之-Hadoop3.x_MapReduce_自定义outputformat案例完善执行---大数据之hadoop3.x工作笔记0123
- 大数据_Hbase-API访问_Java操作Hbase_数据操作_命名空间创建_表创建_表查询---Hbase工作笔记0013
- 理解_授权数据模型_Spring Security OAuth2.0认证授权---springcloud工作笔记112
- 2011浙大878计算机专业基础综合大题答案解析
- JSP页面是否需要重新编译--checkInterval
- Linux防火墙端口设置和mysql端口开放的navicat整合