java关于深拷贝和浅拷贝的理解

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

一、什么是拷贝
拷贝指的就是将一个对象的所有属性(成员属性)拷贝到一个有着相同类型的对象中去
Java中的数据类型分为基本数据类型和引用数据类型,对于这两种数据类型,在进行赋值、用作方法参数、返回值的时候,会有值传递和地址传递的区别。

二、概要
1.浅拷贝
对于基本数据类型就是直接进行值传递,在内存的另一个空间内存放,修改这个值不会影响到拷贝源的值,对于引用数据类型就是进行的是地址传递,并没有对该对象重新开辟一个内存空间进行存放,所以对于引用数据类型的浅拷贝就相当于两个引用指向了同一个内存地址。

例子如下:

public class Demo{
	public static void main(String[] args){
		Student s1=new Student ("小王",22);
		try{
			Student s2=(Student)s1.clone();
		}catch(CloneNotSupportedException e) {
            e.printStackTrace();
            }
		System.out.println(s1.getName().equals(s2.getName());
		s2.setName("小李");
		System.out.println(s1.getName().equals(s2.getName());
	}
}


class Student implements Cloneable{
	private String name;
	private int age;
	public Student(String name,int age){
		this.name=name;
		this.age=age;
	}
	public String getName(){
		return this.name;
	}
	public void setName(String name){
		this.name=name;
	}

	@override
	public Object clone()throws CloneNotSupportedException{
		return super.clone();//浅拷贝
	}
}

毫无疑问,两个都为true。
说明浅拷贝不会拷贝引用类型指向的对象,只会拷贝引用,指向的仍是同一个地址,所以这两个对象的引用对象是同一个对象,修改就会发生改变,浅拷贝也就是一个封装性的赋值操作。

2.深拷贝
深拷贝是将一个对象从内存中完整的拷贝一份出来,从堆内存中开辟一个新的区域存放新对象,且修改新对象不会影响原对象。
深拷贝有两种实现方式:序列化对象方式和属性二次调用clone方法。

例子如下:

public class Test {
    public static void main(String[] args) throws CloneNotSupportedException {

        CloneTest source = new CloneTest(20,new CloneTest());
        // 拷贝
        CloneTest copy = (CloneTest)source.clone();

        System.out.println("修改前:");
        System.out.println(source);
        System.out.println(copy);

        // 修改属性
        copy.setNum(23);
        copy.getCloneTest().setNum(33);

        System.out.println("修改后:");
        System.out.println(source);
        System.out.println(copy);

    }

}

@Data
@AllArgsConstructor
@NoArgsConstructor
class CloneTest implements Cloneable{

    int num;
    CloneTest cloneTest;

    @Override
    public Object clone() throws CloneNotSupportedException {
        CloneTest clone = (CloneTest)super.clone();
        
        if (null!=cloneTest){
            // 对属性进行二次clone
            clone.cloneTest =(CloneTest) cloneTest.clone();
        }
        return clone;
    }
}
---------------输出---------------------
修改前:
CloneTest(num=20, cloneTest=CloneTest(num=0, cloneTest=null))
CloneTest(num=20, cloneTest=CloneTest(num=0, cloneTest=null))
修改后:
CloneTest(num=20, cloneTest=CloneTest(num=0, cloneTest=null))
CloneTest(num=23, cloneTest=CloneTest(num=33, cloneTest=null))

这里就证明了深拷贝就会连引用类型也拷贝一份。

总结:
1.如果对象的属性全是基本类型的,那么可以使用浅拷贝。
2.如果对象有引用属性,那就要基于具体的需求来选择浅拷贝还是深拷贝。
3.如果对象引用任何时候都不会被改变,那么没必要使用深拷贝,只需要使用浅拷贝就行了。
如果对象引用经常改变,那么就要使用深拷,一切都取决于具体需求。文章来源地址https://www.toymoban.com/news/detail-474915.html

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

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

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

相关文章

  • 图解Python深拷贝和浅拷贝

    Python中,对象的赋值,拷贝(深/浅拷贝)之间是有差异的,如果使用的时候不注意,就可能产生意外的结果。 下面本文就通过简单的例子介绍一下这些概念之间的差别。 对象赋值 直接看一段代码: 代码的输出为: 下面来分析一下这段代码: 首先,创建了一个名为will的变

    2024年04月13日
    浏览(70)
  • JS的深拷贝和浅拷贝

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

    2024年02月09日
    浏览(40)
  • C++中的深拷贝和浅拷贝介绍

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

    2024年02月07日
    浏览(50)
  • 【opencv之cv::Mat数据深拷贝和浅拷贝探讨】

    很多时候写程序除了一个强大的架构,细节也很重要,俗话说的话细节决定成败嘛,在使用cv::Mat做图片处理的时候发现,这个数据类型存在深拷贝和浅拷贝的情况,遂想一探究竟。 假设这里原图数据为matSrc : copy方法 结果 matA = matSrc 浅拷贝 matB(matSrc ) 浅拷贝 matC = matSrc .cl

    2024年02月13日
    浏览(36)
  • 电脑硬盘指的是什么?电脑硬盘长什么样子呢

    目录 一,机械硬盘 二、固态硬盘 在很早之前就听说过电脑里面有硬盘,但是不知道电脑硬盘是什么样子,本章文章结合硬盘的接口类型,以及应用技术,说说与硬盘样式有关的知识  如果从硬盘的应用技术来区分硬盘,一般分为两种,早些年大多数设备使用的都是机械式硬

    2024年02月16日
    浏览(51)
  • 新能源汽车的三电指的是什么,作用有什么区别。

    问题描述:新能源汽车的三电指的是什么,作用有什么区别。 问题解答: \\\"新能源汽车的三电\\\"通常指的是新能源汽车中的三大核心电气系统,包括:高压电池系统、电动机驱动系统和电子控制系统。这三者协同工作,实现电能的存储、转换和控制,是新能源汽车的关键组成部

    2024年01月23日
    浏览(38)
  • 【热门框架】Maven中聚合,继承指的是什么?有什么作用?

    Maven中的聚合和继承是两个重要的功能,用于管理多个项目的共同部分。 聚合 Maven中的聚合(Aggregation)指的是将多个子项目聚合成一个父项目的过程。聚合的语法如下: 在这个例子中, modules 元素用来指定子项目列表。在父项目中使用聚合的好处在于: 方便对多个子项目进

    2024年02月02日
    浏览(37)
  • MySQL的“双1”配置指的是什么

    在MySQL配置中, sync_binlog 和 innodb_flush_log_at_trx_commit 都设置为1通常被称作“双1”配置。 这两个选项都与数据的持久性和一致性有关: sync_binlog=1 :该设置会使得MySQL每次提交事务时都会同步二进制日志(binlog)到磁盘。这样可以确保在发生故障时,已提交的事务不会丢失,因

    2024年01月23日
    浏览(41)
  • 网络测试设备有哪些 分别指的是什么

    网络测试设备完成诸如以太网线卡之类网络设备的功能测试,从而确保它们可以正确的接收和传输数据。在一个以太网测试中,以太网的流量或数据从网络中路由到被测试的以太网板上然后被发送到网络测试仪器上。10/100以太网媒体存取控制器(MAC)发送数据到网络流量采集及

    2024年02月05日
    浏览(77)
  • 深度学习中的正则化指的是什么?

    在深度学习中,正则化是一种技术,旨在减少模型的过拟合,提高其在未见数据上的泛化能力。过拟合是指模型在训练数据上表现得非常好,但在新数据上表现不佳的情况。正则化通过对模型添加某种形式的约束或惩罚来实现这一目标。以下是几种常见的正则化技术: L1 和

    2024年01月23日
    浏览(40)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包