Java面试必备:深拷贝、浅拷贝、引用拷贝的区别

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

Java中的拷贝可以分为深拷贝(Deep Copy)、浅拷贝(Shallow Copy)和引用拷贝(Reference Copy)。它们之间的区别如下:

浅拷贝:

只复制对象本身,而不复制对象包含的子对象。新旧对象之间共享子对象的引用,即新对象和原始对象中的子对象指向同一个内存地址。

浅拷贝:使用clone()方法或者Object类的copy()方法。

深拷贝:

不仅复制对象本身,还要复制对象包含的所有子对象。新对象和原始对象所包含的子对象是相互独立的。

深拷贝:可以通过序列化和反序列化、递归遍历等方式来实现。

引用拷贝:

只复制对象的引用,而不复制对象本身。新旧对象之间共享同一个对象实例,即它们的引用指向同一个内存地址。

引用拷贝:直接将对象的引用赋值给另一个变量即可。

例如,以下代码演示了引用拷贝和浅拷贝的区别:

class Person {
    public String name;
    public int age;
}


public class CopyDemo {
    public static void main(String[] args) {
        Person p1 = new Person();
        p1.name = "Alice";
        p1.age = 20;
        
        Person p2 = p1; // 引用拷贝
        
        System.out.println(p1 == p2);         // true, 引用相等
        System.out.println(p1.name == p2.name); // true, 字符串常量池中的引用相同
        System.out.println(p1.age == p2.age);   // true, 基本数据类型的值相同
        
        Person p3 = (Person)p1.clone(); // 浅拷贝
        
        System.out.println(p1 == p3);         // false, 引用不相等
        System.out.println(p1.name == p3.name); // true, 字符串常量池中的引用相同
        System.out.println(p1.age == p3.age);   // true, 基本数据类型的值相同
    }
}

在上面的代码中,p1和p2是两个对象的引用,它们指向同一个对象实例。在使用引用拷贝时,p2和p1共享同一个对象实例,所以它们的属性值相等,并且两个引用也是相等的。

而当使用浅拷贝时,p3是通过调用p1的clone()方法来复制p1的对象的。由于这种方式只是复制了对象本身,而没有复制对象包含的子对象,所以p1和p3引用不同的对象实例。但由于name属性的值是字符串常量,字符串常量池中只有一个实例,所以p1和p3的name属性指向同一个对象。但age是一个基本数据类型,不是一个对象,所以p1和p3的age属性值相等。

例如,以下代码演示了深拷贝和浅拷贝的区别:

public class Address implements Cloneable {
    private String name;  

    @Override
    public Address clone() {
        try {
            return (Address) super.clone();
        } catch (CloneNotSupportedException e) {
            throw new AssertionError();
        }
    }
}

public class Person implements Cloneable {
    public String name;
    public int age;
    private Address address;

    // 省略构造函数、Getter&Setter方法     
    @Override
    public Person clone() {
        try {
            Person person = (Person) super.clone();
            return person;
        } catch (CloneNotSupportedException e) {
            throw new AssertionError();
        }
    }
}
//测试 :

Person person1=new Person(new Address("武汉"));
Person person1Copy=person1.clone(); // true
System.out.println(person1.getAddress()==person1Copy.getAddress());

从输出结构就可以看出, person1 的克隆对象和 person1 使用的仍然是同一个 Address 对象。

深拷贝

这里我们简单对 Person 类的 clone() 方法进行修改,连带着要把 Person 对象内部的 Address 对象一起复制。

@Override
    public Person clone(){
        try{
            Person person=(Person)super.clone();
            person.setAddress(person.getAddress().clone());
            return person;
        }catch(CloneNotSupportedException e){
            throw new AssertionError();
        }
    }
测试 :

Person person1 = new Person(new Address("武汉")); 
Person person1Copy = person1.clone(); // false 
System.out.println(person1.getAddress() == person1Copy.getAddress());

从输出结构就可以看出,虽然 person1 的克隆对象和 person1 包含的 Address 对象已经是不同的了。文章来源地址https://www.toymoban.com/news/detail-410421.html

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

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

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

相关文章

  • web前端面试-- js深拷贝的一些bug,特殊对象属性(RegExp,Date,Error,Symbol,Function)处理,循环引用weekmap处理

    本人是一个web前端开发工程师,主要是vue框架,整理了一些面试题,今后也会一直更新,有好题目的同学欢迎评论区分享 ;-) web面试题专栏:点击此处 在JavaScript中,深拷贝和浅拷贝是两种不同的对象复制方式。 浅拷贝是指将一个对象的引用复制给另一个对象,这意味着两个

    2024年02月07日
    浏览(46)
  • 【面试题】C/C++ 中指针和引用的区别

    指针是一个独立的对象,它可以指向不同的变量或对象,可以重新赋值给其他变量。而引用是已存在的变量的别名,它必须在定义时初始化,并且不能重新绑定到另一个变量。 指针可以是空指针(nullptr),它不指向任何有效的内存地址。而引用必须始终指向一个已存在的对

    2024年02月07日
    浏览(39)
  • java八股文面试[java基础]——浅拷贝和深拷贝

      自验证:创建Class Student两个类, Student中含有Class对象 测试代码: 输出: 可以看到不同的Student对象,但是有相同的Class对象 修改Student clone方法: 可以看到不同的class对象,不同的值: 知识来源: 【23版面试突击】什么是浅拷贝和深拷贝_哔哩哔哩_bilibili 强引用、弱引用介

    2024年02月11日
    浏览(39)
  • JavaScript中的数据类型可以分为两类:原始类型和引用类型。

    JavaScript中的数据类型可以分为两类:原始类型和引用类型。 JavaScript中的原始类型有五种,分别是: 数字(Number):表示数字,包括整数和浮点数。 字符串(String):表示文本字符串。 布尔值(Boolean):表示逻辑上的真或假。 undefined:表示未定义的值。 null:表示空值。

    2024年01月24日
    浏览(47)
  • 一文道破Java中的深拷贝,浅拷贝,零拷贝

    在Java编写代码中,对象的拷贝是一个常见的操作。根据拷贝的层次和方式不同,可以分为深拷贝、浅拷贝和零拷贝。本篇文章我们将详细介绍这三种拷贝方式的概念、实现方法以及使用场景,方便大佬学习及面试。 深拷贝是一种创建对象副本的方法,其中新对象与原始对象

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

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

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

    深拷贝和浅拷贝是编程中常用的两种对象复制方式,它们在复制对象时处理对象内部引用的方式上有所不同。 浅拷贝 浅拷贝(Shallow Copy)只复制对象的顶层结构,而不复制对象内部的引用对象。换句话说,浅拷贝只复制对象的值类型字段和引用类型字段的引用,而不复制引

    2024年01月22日
    浏览(40)
  • Java面试必备八股文

    1.1)Java有哪几种数据类型 基本数据类型:byte(1字节) short(2字节) int(4字节) long(8字节) float(4字节) double(8字节) char(2字节) boolean(1字节) 引用数据类型:String 类 接口 抽象类 枚举 数组 1.2)JVM、JRE和JDK的关系 JVM指的是Java的虚拟机,Java程序需要运行在虚拟机上

    2023年04月08日
    浏览(53)
  • Java中的集合及深拷贝与浅拷贝

    Java是一种面向对象的编程语言,其中集合是常用的数据结构之一,具有方便快捷的特点。在Java开发中,我们常常需要对集合进行复制(拷贝)操作。但是,拷贝操作并不是简单的复制,而应该分为浅拷贝和深拷贝两种不同的方式,本文将分别介绍Java中集合的浅拷贝和深拷贝

    2024年02月07日
    浏览(36)
  • 2023Java 岗面试,进互联网大厂必备 Java 面试八股文真题解析

    前言 一般技术面试官都会通过自己的方式去考察程序员的技术功底与基础理论知识。 很多时候,面试官问的问题会和自己准备的“题库”中的问题不太一样,即使做了复盘,下次面试还是不知道该从何处下手。 为此鄙人软磨硬泡才把阿里 P8 专门归纳整理的 《Java 进阶知识典

    2024年02月15日
    浏览(49)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包