【转】JAVA中的浅拷贝和深拷贝

时间:2022-12-11 16:34:42

原文网址: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中的浅拷贝和深拷贝

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

  2. java中的浅拷贝与深拷贝

    浅拷贝: package test; class Student implements Cloneable { private int number; public int getNumber() { ...

  3. 【Java】 Java中的浅拷贝和深拷贝

    先抛出结论: 浅拷贝是引用拷贝,A对象拷贝B以后,A对象和B对象指向同一块内存地址,改变A对象的属性值会触发B对象属性的改变,有安全风险 深拷贝是对象拷贝,A对象拷贝B以后,A对象和B对象指向不同的额 ...

  4. 深入理解Java中的Clone与深拷贝和浅拷贝

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

  5. Java对象的浅拷贝和深拷贝&amp&semi;&amp&semi;String类型的赋值

    Java中的数据类型分为基本数据类型和引用数据类型.对于这两种数据类型,在进行赋值操作.方法传参或返回值时,会有值传递和引用(地址)传递的差别. 浅拷贝(Shallow Copy): ①对于数据类型是 ...

  6. js中的浅拷贝和深拷贝

    说说最近所学:浅拷贝和深拷贝也叫做浅克隆和深克隆,深浅主要针对的是对象的"深度",常见的对象都是"浅"的,也就是对象里的属性就是单个的属性,而"深&q ...

  7. Javascript中的浅拷贝和深拷贝

    很多开发语言中都有浅拷贝和深拷贝的说法,这里简单区分一下它们在Javascript中的区别,以及jQuery中深拷贝的实现. 在谈浅拷贝和深拷贝之前,先要屡清楚Javascript中的按值访问和按引用 ...

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

    前端工程师应该都比较熟悉浅拷贝和深拷贝的概念,在日常业务代码的过程中,特别是做数据处理的时候,经常行的会遇到,比如如何在不修改原对象的基础上,重新生成一个一模一样的对象,加以利用,又或是,如何巧妙地运 ...

  9. javascript中的浅拷贝和深拷贝&lpar;拷贝引用和拷贝实例&rpar;

    作者:千锋教育链接:https://www.zhihu.com/question/23031215/answer/326129003来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请 ...

随机推荐

  1. 通过统计用户DNS解析记录,实现监控用户上网行为

    上次通过扫描抓包分析TTL的方式检测公司网络开放的端口,发现没有开放53端口(DNS),也就是在公司内部的主机只能用服务器自动分配的DNS,并且发现这是台内部服务器.今天发现bing上不去,检测后发现 ...

  2. git 创建本地分支,然后推送到服务器上

    git checkout -b crm-2.repair-callback.phoneSet git checkout -b crm-2.repair-callback.RepairHis git p ...

  3. 试用VSCode

    VSCode是代码编辑器,不是IDE. 优点: 1.内置ES6代码高亮和提示,语法验证 2.除了支持到变量定义处Go to definition,还支持弹框显示变量定义出peek definition ...

  4. android 通知栏 notifcation

    http://blog.csdn.net/guolin_blog/article/details/50945228  郭神的博客 final NotificationManager manager = ...

  5. 未能正确加载&OpenCurlyDoubleQuote;radlangsvc&period;package&comma;radlangsvc&period;vs&comma;version&equals;10&period;0&period;0&comma;culture&equals;neutra

    1: 参考 http://blog.csdn.net/woaizhoulichao1/article/details/6911809 2: 开 始-->所有程序 -->Mircosoft  ...

  6. css div inline 与 span 区别

    不是说用了display:lnline就变内联原素 和span有区别更奇怪的是ff里面执行就没区别 <span style="">xxx</span> &l ...

  7. centos6&period;5用tomcat安装jenkins

    1下载jdk并安装配置环境变量 # cd /opt/app # .0_45.tar.gz # vi /etc/profile JAVA_HOME=/opt/app/jdk1..0_45 CLASSPA ...

  8. Log4Net不同日志类型写入到不同文件

    1. 一直在用log4net,从来没有自己整理过.实践出真知,只有自己整理过才能真正掌握. 2. log4net,应该读logfornet,以前一直说log4,log4............ 安装 ...

  9. 你不知道的JS之作用域和闭包(五)作用域闭包

    原文:你不知道的js系列 一个简单粗暴的定义 闭包就是即使一个函数在它所在的词法作用域外部被执行,这个函数依然可以访问这个作用域. 比如: function foo() { var a = 2; fu ...

  10. nginx&lowbar;ssl安装

    Nginx的安装依赖于以下三个包,意思就是在安装Nginx之前首先必须安装一下的三个包,安装顺序为我写的顺序: c.1 SSL功能需要openssl库,下载地址:http://www.openssl. ...