【java面试题】- java深拷贝和浅拷贝区别?什么是引用拷贝?

简介: java深拷贝和浅拷贝区别?什么是引用拷贝?

1. 浅拷贝(Shallow Copy): 浅拷贝是一种拷贝方式,只复制对象的引用,而不复制对象本身。换句话说,它创建了一个新的对象,但并没有创建原始对象内部对象的新实例。因此,原始对象和复制的对象共享相同的内部对象,这意味着对一个对象内部对象的修改会影响到另一个对象。

2. 深拷贝(Deep Copy): 深拷贝是一种拷贝方式,不仅复制对象的引用,还复制对象本身。这意味着为原始对象内部的所有对象分配了新的内存空间,创建了完全独立的副本。因此,对一个对象内部对象的修改不会影响到另一个对象。

3. 引用拷贝: 引用拷贝是一种情况,其中一个变量被赋值给另一个变量,而两个变量都引用相同的内存位置。这意味着通过一个变量对对象进行的修改将反映在另一个变量中,因为它们都指向内存中的同一个对象。

下面是上述概念的代码示例:

// 浅拷贝示例classStudent {
intid;
Stringname;
Student(intid, Stringname) {
this.id=id;
this.name=name;
    }
}
publicstaticvoidmain(String[] args) {
Studentstudent1=newStudent(1, "Alice");
Studentstudent2=student1; // 浅拷贝student2.name="Bob"; // student1和student2的name都变为"Bob"System.out.println(student1.name); // 输出:BobSystem.out.println(student2.name); // 输出:Bob}
// 深拷贝示例(使用Cloneable)classPersonimplementsCloneable {
intage;
Stringname;
Person(intage, Stringname) {
this.age=age;
this.name=name;
    }
@OverrideprotectedObjectclone() throwsCloneNotSupportedException {
returnsuper.clone();
    }
}
publicstaticvoidmain(String[] args) throwsCloneNotSupportedException {
Personperson1=newPerson(25, "Alice");
Personperson2= (Person) person1.clone(); // 深拷贝person2.name="Bob"; // 修改不会影响person1System.out.println(person1.name); // 输出:AliceSystem.out.println(person2.name); // 输出:Bob}

在浅拷贝示例中,student1 和 student2 引用同一个 Student 对象,所以对一个对象的修改会反映在另一个对象上。而在深拷贝示例中,person1 和 person2 是两个独立的 Person 对象,所以对一个对象的修改不会影响到另一个对象。

目录
相关文章
|
存储 算法 架构师
阿里面试:PS+PO、CMS、G1、ZGC区别在哪?什么是卡表、记忆集、联合表?问懵了,尼恩来一个 图解+秒懂+史上最全的答案
阿里面试:PS+PO、CMS、G1、ZGC区别在哪?什么是卡表、记忆集、联合表?问懵了,尼恩来一个 图解+秒懂+史上最全的答案
|
人工智能 安全 Java
深入理解Java浅拷贝与深拷贝
本文深入探讨Java中浅拷贝与深拷贝的概念、实现方式及应用场景。浅拷贝通过`clone()`方法复制对象引用,修改新对象会影响原对象;深拷贝则创建完全独立的新对象,确保数据安全。文章通过代码示例讲解两种拷贝方式的实现,并分析其优缺点。同时,针对List类型提供浅拷贝和深拷贝的具体实现方法,帮助读者更好地理解和应用这两种技术。选择拷贝方式时需权衡对象复杂度、大小及操作安全性等因素。
836 2
|
Java 程序员 调度
Java 高级面试技巧:yield() 与 sleep() 方法的使用场景和区别
本文详细解析了 Java 中 `Thread` 类的 `yield()` 和 `sleep()` 方法,解释了它们的作用、区别及为什么是静态方法。`yield()` 让当前线程释放 CPU 时间片,给其他同等优先级线程运行机会,但不保证暂停;`sleep()` 则让线程进入休眠状态,指定时间后继续执行。两者都是静态方法,因为它们影响线程调度机制而非单一线程行为。这些知识点在面试中常被提及,掌握它们有助于更好地应对多线程编程问题。
688 9
|
安全 Java 程序员
Java面试必问!run() 和 start() 方法到底有啥区别?
在多线程编程中,run和 start方法常常让开发者感到困惑。为什么调用 start 才能启动线程,而直接调用 run只是普通方法调用?这篇文章将通过一个简单的例子,详细解析这两者的区别,帮助你在面试中脱颖而出,理解多线程背后的机制和原理。
1078 12
|
编译器 Android开发 开发者
Android经典面试题之Kotlin中Lambda表达式和匿名函数的区别
Lambda表达式和匿名函数都是Kotlin中强大的特性,帮助开发者编写简洁而高效的代码。理解它们的区别和适用场景,有助于选择最合适的方式来解决问题。希望本文的详细讲解和示例能够帮助你在Kotlin开发中更好地运用这些特性。
460 9
Java社招面试题:& 和 && 的区别,HR的套路险些让我翻车!
今日分享的主题是如何区分&和&&的区别,提高自身面试的能力。主要分为以下四部分。 1、自我面试经历 2、&amp和&amp&amp的不同之处 3、&对&&的不同用回答逻辑解释 4、彩蛋
|
Java Apache
Java中的深拷贝与浅拷贝
Java中的深拷贝与浅拷贝
|
Java
Java深拷贝和浅拷贝Map对象
Java深拷贝和浅拷贝Map对象
860 0
【JAVA面试题】什么是深拷贝?什么是浅拷贝?
【JAVA面试题】什么是深拷贝?什么是浅拷贝?
|
存储 Dubbo Java
一篇文章讲明白Java的深拷贝和浅拷贝
一篇文章讲明白Java的深拷贝和浅拷贝
223 0