返回顶部
首页 > 资讯 > 后端开发 > JAVA >Java中的“浅复制”与“深复制”的区别与实现(附代码)
  • 392
分享到

Java中的“浅复制”与“深复制”的区别与实现(附代码)

java基础java深复制浅复制 2016-02-27 19:02:39 392人浏览 猪猪侠
摘要

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

将一个对象的引用复制给另一个对象,一共有三种方式。第一种方式是直接赋值,第二种方式是浅复制,第三种方式是深复制。

1.直接赋值

在Java中,A a1 = a2,这实际上复制的是引用,也就是说 a1 和 a2指向的是同一个对象。因此,当a1变化时,a2里面的成员变量也会跟着变化。

2.浅复制(复制引用但不复制引用的对象)

浅复制,又称为浅拷贝。创建一个新对象,然后将当前对象非静态字段复制到该新对象,如果字段是值类型的,那么对该字段执行复制;如果该字段时引用类型的话,则复制引用但不复制引用的对象。因此,原始对象及其副本引用同一个对象。

(推荐视频:java视频教程

class Resume implements Cloneable{ 
     public Object clone() { 
         try { 
             return (Resume)super.clone(); 
         } catch (Exception e) { 
             e.printStackTrace(); 
         return null; 
         } 
     } 
}

3.深复制(复制对象和其引用对象)

又称深拷贝,不仅复制对象本身,而且复制对象包含的引用指向的所有对象。

class Student implements Cloneable {
         String name;
         int age;
         Professor p;
     Student(String name, int age, Professor p) {
         this.name = name;
         this.age = age;
         this.p = p;
     }
     public Object clone() {
         Student o = null;
         try {
             o = (Student) super.clone();
         } catch (CloneNotSupportedException e) {
             System.out.println(e.toString());
         }
     o.p = (Professor) p.clone();
     return o;
     }
}

使用clone()方法克隆一个对象的步骤:

1)被克隆的类要实现Cloneable接口。

2)被克隆的类要重写clone()方法。

那么在编程时,如何选择使用哪种复制方式呢?首先,检查类有无非基本类型(即对象)的数据成员。若没有,则返回super.clone()即可。若有,确保类中包含的所有非基本类型的成员变量都实现了深复制。

引申:浅复制与深复制的区别?

浅复制(Shallow Clone):被复制的对象的所有变量都含有与原来对象相同的值,而所有其他对象的引用仍然指向原来的对象。换而言之,浅复制仅仅复制所考虑的对象,而不复制它引用的对象。

深复制(Deep Clone):被复制对象的所有变量都含有与原来对象相同的值,除去那些引用其他对象的变量。那些引用其他对象的变量将指向被复制的新对象,而不是原有的那些被引用的对象。换而言之,深复制把复制的对象所引用的对象都复制了一遍。

扩展:

原型模式主要用于对象的复制,实现了接口(实现Cloneable接口),重写一个方法(重写Object类中的clone()方法),即完成了原型模式。

原型模式中的拷贝分为“浅拷贝”和“深拷贝”:

浅拷贝:对值类型的成员变量进行值的复制,对引用类型得成员变量只复制引用,不复制引用的对象。

拷贝:对值类型的成员变量进行值的复制,对引用类型的成员变量也进行引用对象的复制。

(Object类的clone方法只会拷贝对象中的基本数据类型的值,对于数组容器对象、引用对象等都不会拷贝,这就是浅拷贝。如果要实现深拷贝,必须将原型模式中的数组、容器对象、引用对象等另行拷贝。)

原型模式的优点:

如果创建新的对象比较复杂时,可以利用原型模式简化对象的创建过程。

是永远是模式创建对象比直接new一个对象在性能上要好得多,因为Object类的clone方法是一个本地方法,它直接操作内存中的二进制流,特别是复制大对象时,性能的差别非常明显。

原型模式的使用场景:

因为以上优点,所以在需要重复地创建相似对象时可以考虑使用原型模式。比如需要在一个循环体内创建对象,假如对象创建过程比较复杂或者循环次数很多的话,使用原型模式不但可以简化创建过程,而且可以使系统的整体性能提高很多。

本文来自编程界网,java教程栏目,欢迎学习

--结束END--

本文标题: Java中的“浅复制”与“深复制”的区别与实现(附代码)

本文链接: https://lsjlt.com/news/3638.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Java中的“浅复制”与“深复制”的区别与实现(附代码)
    将一个对象的引用复制给另一个对象,一共有三种方式。第一种方式是直接赋值,第二种方式是浅复制,第三种方式是深复制。1.直接赋值在Java中,A a1 = a2,这实际上复制的是引用,也就是说 a1 和 a2指向的是同一个对象。因此,当a1变化...
    99+
    2016-02-27
    java基础 java 深复制 浅复制
  • 深入浅析Java中对象的深复制与浅复制
    本篇文章为大家展示了深入浅析Java中对象的深复制与浅复制,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。 Java对象深复制与浅复制实例详解我们在遇到一些业务场景的时候经常需要对对象进行复...
    99+
    2023-05-31
    java 对象 中对
  • Python中的赋值与浅复制与深复制之间
    #赋值与浅复制一层列表 """a = [1, 2]    b = a   #赋值c = a.copy() #浅复制a.append(3)     print(b)  #父对象改变print(c)  #父对象不变'''[1, 2, 3][1...
    99+
    2023-01-30
    赋值 Python
  • JavaScript 赋值,浅复制和深复制的区别
    目录一、变量赋值1.1 原始值和引用值1.2 赋值二、浅复制(Shallow Copy)2.1 原生 JavaScript 中的浅复制Object.assign()2.2 浅复制的手...
    99+
    2024-04-02
  • JavaScript数组中的深复制与浅复制是什么
    本篇内容介绍了“JavaScript数组中的深复制与浅复制是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所...
    99+
    2024-04-02
  • Java 浅复制和深复制的实例详解
    Java 浅复制和深复制的实例详解1 浅复制和深复制区别浅复制:浅复制只是复制本对象的原始数据类型,如int、float、String,对于数组和对象引用等是不会复制的。因此浅复制是有风险的。深复制:不但对原始数据类型进行复制,对于对象中的...
    99+
    2023-05-31
    java 浅复制 深复制
  • JavaScript赋值,浅复制和深复制的区别是什么
    本篇内容介绍了“JavaScript赋值,浅复制和深复制的区别是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1、变量赋值不知道会不会有...
    99+
    2023-06-30
  • PHP数组的复制策略:深度复制与浅复制,解析与性能对比
    在 php 中,数组复制有两种策略:深度复制和浅复制。深度复制创建源数组的独立副本,对其中一个数组的更改不会影响另一个数组。浅复制仅复制数组的引用,对其中一个数组的更改会反映在另一个数组...
    99+
    2024-05-02
    深度复制 浅复制
  • Java中对象的深复制和浅复制的详细介绍
    这篇文章主要介绍“Java中对象的深复制和浅复制的详细介绍”,在日常操作中,相信很多人在Java中对象的深复制和浅复制的详细介绍问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java中对象的深复制和浅复制的详...
    99+
    2023-06-17
  • Java中的数组复制(clone与arraycopy)代码详解
    JAVA数组的复制是引用传递,而并不是其他语言的值传递。1、cloneprotectedObjectclone()throwsCloneNotSupportedException创建并返回此对象的一个副本。“副本”的准确含义可能依赖于对象的...
    99+
    2023-05-30
    java 数组复制 ava
  • 深入浅析java中TCP与UDP的区别
    深入浅析java中TCP与UDP的区别?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。TCP/UDP:TCP主要是面向连接的协议,它包含有建立和拆除连接,保证数据流的顺序和正...
    99+
    2023-05-31
    java tcp udp
  • python中的深复制和浅复制是什么意思
    本篇内容介绍了“python中的深复制和浅复制是什么意思”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!0、定义:    ...
    99+
    2023-06-04
  • 深入浅析Java中的条件控制与循环控制
    今天就跟大家聊聊有关深入浅析Java中的条件控制与循环控制,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。条件控制语句:1. if-else语句if(条件1){代码块1;}else i...
    99+
    2023-05-31
    java 循环控制 条件控制
  • 深入浅析Java中HashMap与HashTable容器的区别
    这篇文章给大家介绍深入浅析Java中HashMap与HashTable容器的区别,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。1、HashMap HashMap继承抽象类AbstractMap,实现接口Map、Clon...
    99+
    2023-05-31
    java hashmap hashtable
  • Python中对象的引用与复制代码示例
    可以说Python没有赋值,只有引用。你这样相当于创建了一个引用自身的结构,所以导致了无限循环。为了理解这个问题,有个基本概念需要搞清楚。 Python没有「变量」,我们平时所说的变量其实只是「标签」,是引...
    99+
    2022-06-04
    示例 对象 代码
  • 深入剖析MongoDB的数据复制与故障恢复机制
    深入剖析MongoDB的数据复制与故障恢复机制引言:随着大数据时代的到来,数据的存储和管理变得愈发重要。在数据库领域,MongoDB作为一种广泛应用的NoSQL数据库,其数据复制和故障恢复机制对于保障数据的可靠性和高可用性至关重要。本文将深...
    99+
    2023-11-04
    MongoDB 故障恢复 数据复制
  • 深入浅析Android中DecorView与ViewRootImpl的区别
    今天就跟大家聊聊有关深入浅析Android中DecorView与ViewRootImpl的区别,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。从setContentView说起一般地,...
    99+
    2023-05-31
    android viewrootimpl decorview
  • Java深度复制功能与用法实例分析
    本文实例讲述了Java深度复制功能与用法。分享给大家供大家参考,具体如下:写在前面:什么是深度复制?在Java里面,在创建一个对象,我们通常会有一个引用指向该对象,当我们通过引用变量改变对象的值(属性)时,引用是不变的,变的是内存里面的那块...
    99+
    2023-05-30
  • Java面试题-实现复杂链表的复制代码分享
    阿里终面在线编程题,写出来与大家分享一下        有一个单向链表,每个节点都包含一个random指针,指向本链表中的某个节点或者为空,写一个深度拷贝函数,拷贝整个链...
    99+
    2023-05-31
    java 链表 ava
  • 深入浅析Android中的ListView复用机制
    这篇文章给大家介绍深入浅析Android中的ListView复用机制,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。1.ListView的复用机制  ListView是我们经常使用的一个控件,虽然说都会用,但是...
    99+
    2023-05-31
    android listview roi
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作