Java中的深拷贝与浅拷贝

这篇具有很好参考价值的文章主要介绍了Java中的深拷贝与浅拷贝。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

深拷贝与浅拷贝

深拷贝和浅拷贝是编程中常用的两种对象复制方式,它们在复制对象时处理对象内部引用的方式上有所不同。

浅拷贝

浅拷贝(Shallow Copy)只复制对象的顶层结构,而不复制对象内部的引用对象。换句话说,浅拷贝只复制对象的值类型字段和引用类型字段的引用,而不复制引用对象本身。

  • 特点:如果原始对象中的字段是值类型,则复制其值;如果字段是引用类型,则复制引用地址而不是引用的对象本身。
  • 结果:浅拷贝后的新对象与原对象共享引用类型的成员。因此,修改其中一个对象的引用类型成员可能会影响另一个对象。

举例(伪代码):

original = { a: 1, b: { c: 2, d: 3 } }
shallowCopy = copy(original) // 浅拷贝
// shallowCopy = { a: 1, b: { c: 2, d: 3 } } 但 shallowCopy.b 和 original.b 指向同一个对象

深拷贝

深拷贝(Deep Copy)则是复制对象的所有层级结构。一个对象进行深拷贝后,不仅复制了对象的顶层结构,还复制了对象内部的所有引用对象。

  • 特点:无论是值类型还是引用类型,都会被完全复制到新对象中。
  • 结果:深拷贝后的对象与原对象不共享任何成员。修改一个对象的任何成员不会影响到另一个对象。

举例(伪代码):

original = { a: 1, b: { c: 2, d: 3 } }
deepCopy = deepcopy(original) // 深拷贝
// deepCopy = { a: 1, b: { c: 2, d: 3 } } 且 deepCopy.b 和 original.b 指向不同的对象

应用

浅拷贝通常用于复制不包含复杂对象或不需要独立操作引用对象的场景。而深拷贝则适用于需要完全独立的对象副本,或者当对象内部也包含引用对象时。

在不同的编程语言中,实现深拷贝和浅拷贝的方式可能不同。例如,在JavaScript中,可以使用Object.assign()或扩展运算符{...obj}实现浅拷贝,而深拷贝可能需要递归复制或使用如JSON.parse(JSON.stringify(obj))这样的技巧。在Python中,copy模块提供了copy()(浅拷贝)和deepcopy()(深拷贝)函数。

Java中的深拷贝与浅拷贝

在Java中,深拷贝和浅拷贝是处理对象复制时常见的两种方法,它们在处理对象内部引用时有本质的区别。

浅拷贝(Shallow Copy)

浅拷贝创建一个新的对象,然后将原始对象的非静态字段复制到新对象。如果字段是值类型(如基本数据类型),它将复制值;如果字段是引用类型,则复制引用但不复制引用的对象本身。

  • 实现方式:在Java中,浅拷贝通常可以通过使用Object.clone()方法来实现。为了使用clone()方法,类必须实现Cloneable接口并重写clone()方法。
  • 示例
    public class ShallowCopyExample implements Cloneable {
        private int[] data;
    
        public ShallowCopyExample() {
            data = new int[10];
            for (int i = 0; i < data.length; i++) {
                data[i] = i;
            }
        }
    
        public ShallowCopyExample clone() {
            try {
                return (ShallowCopyExample) super.clone();
            } catch (CloneNotSupportedException e) {
                return null;
            }
        }
    }
    

在这个例子中,clone()方法创建了ShallowCopyExample对象的浅拷贝。数组data的新引用被创建,但数组的内容并没有被复制。

深拷贝(Deep Copy)

深拷贝不仅复制对象及其字段,还递归复制它引用的所有对象。这意味着整个对象树都被复制了。

  • 实现方式:在Java中,实现深拷贝可以通过多种方式,例如递归复制所有对象、使用序列化/反序列化等。
  • 示例(使用序列化)
    import java.io.*;
    
    public class DeepCopyExample implements Serializable {
        private int[] data;
    
        public DeepCopyExample deepCopy() {
            try {
                ByteArrayOutputStream bos = new ByteArrayOutputStream();
                ObjectOutputStream out = new ObjectOutputStream(bos);
                out.writeObject(this);
    
                ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());
                ObjectInputStream in = new ObjectInputStream(bis);
                return (DeepCopyExample) in.readObject();
            } catch (IOException | ClassNotFoundException e) {
                return null;
            }
        }
    }
    

在这个例子中,deepCopy()方法通过序列化和反序列化对象来创建一个深拷贝。这种方法需要对象及其所有引用的对象都实现Serializable接口。文章来源地址https://www.toymoban.com/news/detail-815143.html

区别

  • 浅拷贝仅复制对象本身和对象内的引用地址,不复制引用的对象。
  • 深拷贝则完全复制了整个对象及其引用的所有对象,新对象与原对象之间不共享任何内容。

使用场景

  • 使用浅拷贝当你需要一个与原对象共享部分数据的独立对象时。
  • 使用深拷贝当你需要一个完全独立于原对象的副本时,例如,当你要修改新对象而不影响原对象的内部状态时。

到了这里,关于Java中的深拷贝与浅拷贝的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C++中的深拷贝和浅拷贝介绍

    对于基本类型的数据以及简单的对象,它们之间的拷贝非常简单,就是按位复制内存。例如: b 和 obj2 都是以拷贝的方式初始化的,具体来说,就是将 a 和 obj1 所在内存中的数据按照二进制位(Bit)复制到 b 和 obj2 所在的内存,这种默认的拷贝行为就是浅拷贝,这和调用 me

    2024年02月07日
    浏览(49)
  • Java中的深克隆和浅克隆(Clone)

    浅克隆(shallow clone)和深克隆(deep clone)是两种不同的对象复制方法。 浅克隆会创建一个新对象,然后将原始对象的所有字段复制到新对象中。如果字段是基本类型,则它们的值将被直接复制。如果字段是引用类型,则只会复制引用,而不会复制引用指向的对象。这意味着

    2024年02月16日
    浏览(41)
  • C++深拷贝与浅拷贝

    默认提供的拷贝构造就是浅拷贝,如果拷贝的对象中含有成员指针变量指向堆区中的内存空间,那么就会出现两个对象中的成员指针变量指向同一块堆区空间,当方法执行结束后,对象就会被释放,调用析构函数(析构函数中存在释放在堆区开辟的内存空间),就会存在一块内

    2023年04月25日
    浏览(38)
  • 【python 深拷贝与浅拷贝】

    python 深拷贝与浅拷贝 在用影刀编写流程的时候发现,明明只修改人名为“小张”对应的字典里面的值,但是所有的人名对应的值都被修改了。 第14行,设置键值对,值对应的变量“初始打卡类型字典”是前面流程生成的,还是引用了原来的地方。 用python来复现: 1、如果列

    2024年02月05日
    浏览(38)
  • JS的深拷贝和浅拷贝

    ‍本文作者是360奇舞团开发工程师 在讨论深拷贝和浅拷贝之前,先来了解下Js基本数据和引用数据类型的存储问题 基本数据类型:Number String Boolean Undefined Symbol Null 引用类型 :Object,function,Array等 基本数据类型的值存放在栈中,在栈中存放的是对应的值;引用类型对应的值存

    2024年02月09日
    浏览(39)
  • JS之深拷贝与浅拷贝

     深拷贝 与 浅拷贝  针对于 引用类型(Object,Array,Function) 来说的 浅拷贝:在栈中分配一块新内存,拷贝需要拷贝的值,           对简单数据类型,就是拷贝值;对复杂数据类型,就是拷贝了一份栈内存储的堆内存的地址  深拷贝:在堆中重新分配新内存,存储新的拷贝数据

    2024年02月09日
    浏览(46)
  • Java中的浅拷贝与深拷贝

    在Java中,对象的拷贝有两种方式:浅拷贝和深拷贝。它们分别代表了不同的拷贝方式,拷贝出的新对象与原始对象之间存在一定的差异。本文将详细介绍浅拷贝和深拷贝的概念、特点和实现方式,并且通过实例进行解析。  一、浅拷贝  浅拷贝是指在对一个对象进行拷贝时,

    2024年02月14日
    浏览(40)
  • [开发语言][c++][python]:C++与Python中的赋值、浅拷贝与深拷贝

    写在前面 :Python和C++中的赋值与深浅拷贝,由于其各自语言特性的问题,在概念和实现上稍微有点差异,本文将这C++和Python中的拷贝与赋值放到一起,希望通过对比学习两语言实现上的异同点,加深对概念的理解。 C++中所谓的 浅拷贝 就是由(系统默认的) 拷贝构造函数对

    2024年02月02日
    浏览(57)
  • 面试官:深拷贝与浅拷贝有啥区别?

    首先,明确一点深拷贝和浅拷贝是针对对象属性为对象的,因为基本数据类型在进行赋值操作时(也就是拷贝)是直接将值赋给了新的变量,也就是该变量是原变量的一个副本,这个时候你修改两者中的任何一个的值都不会影响另一个,而对象或者引用数据来说在进行浅拷贝

    2024年02月07日
    浏览(39)
  • 【Python】python深拷贝与浅拷贝详解(必须掌握)

    深拷贝和浅拷贝是python必须要掌握的内容,无论你是面试开发、测试、运维等职位,只要是python,深拷贝与浅拷贝是面试官常问的一个重要知识点。 (关注“测试开发自动化” 弓中皓,获取更多学习内容) 相同点: 无论深拷贝还是浅拷贝都会创建一个新对象。即:拷贝出来

    2024年03月25日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包