什么是浅拷贝和深拷贝?

article/2025/10/5 14:14:14

文章目录

    • 1、什么是浅拷贝?
    • 2、什么是深拷贝?
      • 2.1、常见的深拷贝方式

在Java语言中,当我们需要拷贝一个Java对象的时候,常见的会有两种方式的拷贝:浅拷贝与深拷贝

  • 浅拷贝:只是拷贝了源对象的地址,所以源对象的任何值发生改变时,拷贝对象的值也会随之而发生变化。
  • 深拷贝:则是拷贝了源对象的所有值而不是地址,所以即使源对象的值发生任何变化时,拷贝对象的值也不会改变。

1、什么是浅拷贝?

、

浅拷贝代码演示(最常见的方式):

/***  浅拷贝:拷贝的就是目标对象在堆内存中的地址*         注意:拷贝对象改变,源对象(目标对象)改变*/
public class SlowCopy {public static void main(String[] args) {User user = new User();user.setUserName("张三");user.setPassWord("123456");//浅拷贝User user1 = user ;System.out.println(user); //com.sqx.copy.bean.User@1b6d3586System.out.println(user1); //com.sqx.copy.bean.User@1b6d3586}
}

2、什么是深拷贝?

深拷贝的对象修改的时候,源对象是不受影响的!

、

2.1、常见的深拷贝方式

一般常用的深拷贝方式有如下5种

1、构造函数方式

/*** 构造器实现深拷贝 :我们拷贝对象和源对象是隔离的,互不干扰!*/
public class DeepCopy {public static void main(String[] args) {//深拷贝User user = new User("张三","123456");User user1 = new User("李四","654321");System.out.println(user); //com.sqx.copy.bean.User@1b6d3586System.out.println(user1); //com.sqx.copy.bean.User@4554617c}
}

2、重写Clone方法

1、实现Cloneable接口,Cloneable其实就是一个标记接口,只有实现这个接口后,然后在类中重写Object中的clone方法,然后通过类

调用clone方法才能克隆成功,如果不实现这个接口,则会抛出CloneNotSupportedException(克隆不被支持)异常。

、

public class Student implements Cloneable {private String userName ;private String passWord ;   // 此处省略set\get方法 @Overridepublic Student clone() throws CloneNotSupportedException {return (Student) super.clone();}
}

2、代码演示深拷贝

/***     重写clone方法实现深拷贝*/
public class DeepCopy01 {public static void main(String[] args) {Student student01 = new Student("张三","123456");Student student02 = null;try {student02 = student01.clone();   // 深拷贝对象} catch (CloneNotSupportedException e) {e.printStackTrace();}System.out.println(student01);  //com.sqx.copy.bean.Student@1b6d3586System.out.println(student02);  //com.sqx.copy.bean.Student@4554617cSystem.out.println(student01.equals(student02));  // true 标识内容相同,但是仅地址不同(记得重写equlas)}
}

我们发现拷贝的student02对象和源对象地址已经不同了,但是内容是一致的~

补充

我们的ArrayList 、LinkedList等都实现了Cloneable接口,支持深拷贝

public class ArrayList<E> extends AbstractList<E>implements List<E>, RandomAccess, Cloneable, java.io.Serializable {...
}

样例演示:

public class ArrayListCopyTest {public static void main(String[] args) {ArrayList<User> list = new ArrayList<>();User user = new User("张三", "123456");list.add(user) ;System.out.println("list: "+list);  //源ArrayList对象ArrayList<User> clone = (ArrayList<User>) list.clone();System.out.println("clone: "+clone);    //经过深拷贝得到的ArrayList对象System.out.println(list == clone); // false 经过深拷贝,创建的是新的对象System.out.println(list.get(0) == clone.get(0));  //true 说明拷贝对象和源对象的内容是一样的!}
}

总结:

  • 浅拷贝只复制某个对象的引用,而不复制对象本身,新旧对象还是共享同一块内存
  • 深拷贝会创造一个一摸一样的对象,新对象和原对象不共享内存,修改新对象不会改变原对对象

实现深拷贝的方式还有:Apache Commons Lang序列化、Gson序列化、jackson序列化等


http://chatgpt.dhexx.cn/article/bu42qmlg.shtml

相关文章

基于java实现浅拷贝和深拷贝

目录 1、概念2、浅拷贝2.1、浅拷贝实战 3、深拷贝3.1、嵌套 clone 方法3.2、使用序列化流3.3、使用开源工具类 1、概念 浅拷贝&#xff1a;在拷贝一个对象时&#xff0c;复制基本数据类型的成员变量&#xff0c;但对引用数据类型的成员变量只进行引用的传递&#xff08;复制其…

js实现浅拷贝和深拷贝

一.数据类型 数据分为基本数据类型和引用数据类型 基本数据类型(String, Number, Boolean, Null, Undefined&#xff0c;Symbol) 引用数据类型&#xff08;Object[Array属于Object]&#xff09; 基本数据类型的特点&#xff1a;直接存储在栈(stack)中的数据 引用数据类型的特点…

浅拷贝和深拷贝

最近学习string类的时候感觉这里概念有点混淆&#xff0c;浅拷贝与深拷贝的区别&#xff0c;上网查了一下&#xff0c;原来没我想 的难么复杂&#xff0c;以下是我的理解&#xff0c;如果有不对的地方求大佬留言交流交流。 浅拷贝&#xff1a; 顾名思义就是浅层的拷贝&#xff…

理解浅拷贝和深拷贝以及实现方法

一、数据类型 数据分为基本数据类型(String, Number, Boolean, Null, Undefined&#xff0c;Symbol)和引用数据类型Object&#xff0c;包含&#xff08;function&#xff0c;Array&#xff0c;Date&#xff09;。 1、基本数据类型的特点&#xff1a;直接存储在栈内存中的数据 …

VUE浅拷贝和深拷贝

文章目录 前言一、数据类型1.1.基本数据类型1.2.引用数据类型1.3.区别 二、浅拷贝2.1.定义2.2.浅拷贝特点 三、深拷贝3.1.定义3.2.深拷贝特点 四、拷贝实现方案4.1.Object.assign()4.2.concat()4.3.slice()4.4.JSON.parse(JSON.stringify())4.5.cloneDeep() 五、结论 前言 在理…

C# 中的浅拷贝和深拷贝

在本文中&#xff0c;将通过示例讨论C&#xff03;中的浅拷贝和深拷贝。这是上一篇文章的续篇。因此&#xff0c;在继续本文之前&#xff0c;请阅读以前的文章&#xff0c;其中之前使用示例讨论了C&#xff03;中的原型设计模式。 什么是深拷贝和浅拷贝&#xff1f; 浅复制和…

JAVA 浅拷贝和深拷贝

拷贝 拷贝即对已有的数据创建一个副本&#xff0c;在 Java 中&#xff0c;拷贝可分为引用拷贝、浅拷贝、深拷贝。 引用拷贝 在 Java 中&#xff0c;实例化后的对象存储在堆区&#xff0c;而局部变量存放在局部变量表(栈)中&#xff0c;如&#xff1a; public void yinYongC…

js浅拷贝和深拷贝

1、JS数据类型 基本数据类型&#xff1a;Boolean、String、Number、null、undefined 引用数据类型&#xff1a;Object、Array、Function、RegExp、Date等 2、深拷贝与浅拷贝 深拷贝和浅拷贝都只针对引用数据类型&#xff0c; 浅拷贝会对对象逐个成员依次拷贝&#xff0c;但…

C++浅拷贝和深拷贝

1、浅拷贝 浅拷贝&#xff1a;又称值拷贝&#xff0c;将源对象的值拷贝到目标对象中去&#xff0c;本质上来说源对象和目标对象共用一份实体&#xff0c;只是所引用的变量名不同&#xff0c;地址其实还是相同的。 举个简单的例子&#xff0c;你的小名叫西西&#xff0c;大名叫…

彻底理解Python中浅拷贝和深拷贝的区别

目录 前言 1. 浅拷贝和深拷贝的概念 2. is和的区别 3. 赋值操作 4. copy模块里面的copy()方法 5. copy模块里面的deepcopy()方法 6.字典自带的copy方法 7.切片表达式拷贝 8.总结 前言 Python 的所有变量其实都是指向内存中的对象的一个指针&#xff0c;这确实和之前学…

如何理解java的回调函数?

对于技术问题&#xff0c;会用是一回事&#xff0c;理解这个技术问题的来龙去脉、设计者当初为什么要设计这个功能、这个技术问题有哪些优势、适用哪些场景又是另外回事了。 前者照猫画虎得其形&#xff0c;后者形神兼备得其意&#xff0c;这也是所谓青铜与王者的区别。 会使…

java使用回调函数

java回调函数 回调函数&#xff08;callback Function&#xff09;&#xff0c;顾名思义就是用来回调的函数。在两个类A、B中&#xff0c;A在调用B接口的同时B也在调用A 回调函数也常用于线程中的异步获取消息。 举个简单的例子&#xff0c;公司中老板分发任务给员工A&#…

java中回调函数的实现

在java的事务中&#xff0c;有时候可能会遇到以下情况&#xff0c;第一步是更新某某表&#xff0c;中间可能要更新不确定的多步&#xff0c;最后一步是更新缓存&#xff0c;结构大致如下&#xff1a; &#xff08;1&#xff09;updateA(); &#xff08;2&#xff09;updateXX…

什么是java回调函数

回调函数 一&#xff1a;故事背景二&#xff1a;概念三&#xff1a;回调函数的作用四&#xff1a;java中如何进行回调4.1 类图4.2 定义回调接口4.3 实现回调接口4.4 调用方法使用回调函数4.5 Main函数调用4.6 总结描述 五&#xff1a;回调函数的优点5.1 灵活性5.2 解耦性5.3 异…

简单举例JAVA回调函数的实现

来自维基百科的对回调&#xff08;Callback&#xff09;的解释&#xff1a;In computer programming, a callback is any executable code that is passed as an argument to other code, which is expected to call back (execute) the argument at a given time. This execut…

java回调函数机制

Java回调函数机制 参考了网上的一些资料&#xff0c;下面也做出一些总结&#xff0c;供初学者了解学习。 一、 概述 软件模块之间总是存在着一定的接口&#xff0c;从调用方式上&#xff0c;可以把他们分为三类&#xff1a;同步调用、回调、异步调用 。 同步调用&#xff1a;一…

java中如何实现回调函数

最近工作需要研究了一会别人写的库&#xff0c;其中充满着各种"回调函数"&#xff0c;因此把自己理解给记录下来&#xff0c;存档。 首先我们来看看回调函数 这个概念的具体由来&#xff0c;百度百科的示义如下&#xff1a; 回调函数就是一个通过函数指针调用的函数。…

Java回调函数 + 使用案例

文章目录 前言什么是回调函数第0个版本第1个版本第2个版本第3个版本第4个版本第5个版本第6个版本回头解析前言描述的问题1. MethodIntrospector.selectMethods()2. 抽象类MethodIntrospector3. 方法selectMethods()4. 成员变量USER_DECLARED_METHODS5. 方法doWithMethods()6. d…

Java-回调函数

什么是回调 函数调用可以分为三种模式&#xff0c;串行调用、异步调用、回调。这三种都是日常开发中常见到的方式。 一个方法执行完&#xff0c;再执行下一个&#xff0c;串行逻辑会阻塞线程执行流程&#xff0c;等到所有逻辑执行结束&#xff0c;线程才会结束。 异步执行是…

java回调函数(callBack)

最近有个新同事给我写了个接口&#xff0c;说是用到了回调&#xff0c;我等了半天发现结果才返回回来&#xff0c;把我都整急了。最后我看了他的代码&#xff0c;目瞪口呆。他还信誓旦旦的说没错&#xff0c;按网上的例子来写的。 我一搜&#xff0c;网上例子真一大堆&#xff…