国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Java面試必備:深拷貝、淺拷貝、引用拷貝的區(qū)別

這篇具有很好參考價值的文章主要介紹了Java面試必備:深拷貝、淺拷貝、引用拷貝的區(qū)別。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

Java中的拷貝可以分為深拷貝(Deep Copy)、淺拷貝(Shallow Copy)和引用拷貝(Reference Copy)。它們之間的區(qū)別如下:

淺拷貝:

只復制對象本身,而不復制對象包含的子對象。新舊對象之間共享子對象的引用,即新對象和原始對象中的子對象指向同一個內存地址。

淺拷貝:使用clone()方法或者Object類的copy()方法。

深拷貝:

不僅復制對象本身,還要復制對象包含的所有子對象。新對象和原始對象所包含的子對象是相互獨立的。

深拷貝:可以通過序列化和反序列化、遞歸遍歷等方式來實現(xiàn)。

引用拷貝:

只復制對象的引用,而不復制對象本身。新舊對象之間共享同一個對象實例,即它們的引用指向同一個內存地址。

引用拷貝:直接將對象的引用賦值給另一個變量即可。

例如,以下代碼演示了引用拷貝和淺拷貝的區(qū)別:

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, 基本數(shù)據(jù)類型的值相同
        
        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, 基本數(shù)據(jù)類型的值相同
    }
}

在上面的代碼中,p1和p2是兩個對象的引用,它們指向同一個對象實例。在使用引用拷貝時,p2和p1共享同一個對象實例,所以它們的屬性值相等,并且兩個引用也是相等的。

而當使用淺拷貝時,p3是通過調用p1的clone()方法來復制p1的對象的。由于這種方式只是復制了對象本身,而沒有復制對象包含的子對象,所以p1和p3引用不同的對象實例。但由于name屬性的值是字符串常量,字符串常量池中只有一個實例,所以p1和p3的name屬性指向同一個對象。但age是一個基本數(shù)據(jù)類型,不是一個對象,所以p1和p3的age屬性值相等。

例如,以下代碼演示了深拷貝和淺拷貝的區(qū)別:

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;

    // 省略構造函數(shù)、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 對象已經(jīng)是不同的了。文章來源地址http://www.zghlxwxcb.cn/news/detail-410421.html

到了這里,關于Java面試必備:深拷貝、淺拷貝、引用拷貝的區(qū)別的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉載,請注明出處: 如若內容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • web前端面試-- js深拷貝的一些bug,特殊對象屬性(RegExp,Date,Error,Symbol,F(xiàn)unction)處理,循環(huán)引用weekmap處理

    web前端面試-- js深拷貝的一些bug,特殊對象屬性(RegExp,Date,Error,Symbol,F(xiàn)unction)處理,循環(huán)引用weekmap處理

    本人是一個web前端開發(fā)工程師,主要是vue框架,整理了一些面試題,今后也會一直更新,有好題目的同學歡迎評論區(qū)分享 ;-) web面試題專欄:點擊此處 在JavaScript中,深拷貝和淺拷貝是兩種不同的對象復制方式。 淺拷貝是指將一個對象的引用復制給另一個對象,這意味著兩個

    2024年02月07日
    瀏覽(28)
  • 【面試題】C/C++ 中指針和引用的區(qū)別

    指針是一個獨立的對象,它可以指向不同的變量或對象,可以重新賦值給其他變量。而引用是已存在的變量的別名,它必須在定義時初始化,并且不能重新綁定到另一個變量。 指針可以是空指針(nullptr),它不指向任何有效的內存地址。而引用必須始終指向一個已存在的對

    2024年02月07日
    瀏覽(16)
  • java八股文面試[java基礎]——淺拷貝和深拷貝

    java八股文面試[java基礎]——淺拷貝和深拷貝

    ? 自驗證:創(chuàng)建Class Student兩個類, Student中含有Class對象 測試代碼: 輸出: 可以看到不同的Student對象,但是有相同的Class對象 修改Student clone方法: 可以看到不同的class對象,不同的值: 知識來源: 【23版面試突擊】什么是淺拷貝和深拷貝_嗶哩嗶哩_bilibili 強引用、弱引用介

    2024年02月11日
    瀏覽(22)
  • JavaScript中的數(shù)據(jù)類型可以分為兩類:原始類型和引用類型。

    JavaScript中的數(shù)據(jù)類型可以分為兩類:原始類型和引用類型。 JavaScript中的原始類型有五種,分別是: 數(shù)字(Number):表示數(shù)字,包括整數(shù)和浮點數(shù)。 字符串(String):表示文本字符串。 布爾值(Boolean):表示邏輯上的真或假。 undefined:表示未定義的值。 null:表示空值。

    2024年01月24日
    瀏覽(30)
  • 一文道破Java中的深拷貝,淺拷貝,零拷貝

    一文道破Java中的深拷貝,淺拷貝,零拷貝

    在Java編寫代碼中,對象的拷貝是一個常見的操作。根據(jù)拷貝的層次和方式不同,可以分為深拷貝、淺拷貝和零拷貝。本篇文章我們將詳細介紹這三種拷貝方式的概念、實現(xiàn)方法以及使用場景,方便大佬學習及面試。 深拷貝是一種創(chuàng)建對象副本的方法,其中新對象與原始對象

    2024年02月04日
    瀏覽(22)
  • Java中的深拷貝與淺拷貝

    深拷貝和淺拷貝是編程中常用的兩種對象復制方式,它們在復制對象時處理對象內部引用的方式上有所不同。 淺拷貝 淺拷貝(Shallow Copy)只復制對象的頂層結構,而不復制對象內部的引用對象。換句話說,淺拷貝只復制對象的值類型字段和引用類型字段的引用,而不復制引

    2024年01月22日
    瀏覽(40)
  • Java中的淺拷貝與深拷貝

    在Java中,對象的拷貝有兩種方式:淺拷貝和深拷貝。它們分別代表了不同的拷貝方式,拷貝出的新對象與原始對象之間存在一定的差異。本文將詳細介紹淺拷貝和深拷貝的概念、特點和實現(xiàn)方式,并且通過實例進行解析。 ?一、淺拷貝 ?淺拷貝是指在對一個對象進行拷貝時,

    2024年02月14日
    瀏覽(30)
  • Java面試必備八股文

    Java面試必備八股文

    1.1)Java有哪幾種數(shù)據(jù)類型 基本數(shù)據(jù)類型:byte(1字節(jié)) short(2字節(jié)) int(4字節(jié)) long(8字節(jié)) float(4字節(jié)) double(8字節(jié)) char(2字節(jié)) boolean(1字節(jié)) 引用數(shù)據(jù)類型:String 類 接口 抽象類 枚舉 數(shù)組 1.2)JVM、JRE和JDK的關系 JVM指的是Java的虛擬機,Java程序需要運行在虛擬機上

    2023年04月08日
    瀏覽(35)
  • Java中的集合及深拷貝與淺拷貝

    Java中的集合及深拷貝與淺拷貝

    Java是一種面向對象的編程語言,其中集合是常用的數(shù)據(jù)結構之一,具有方便快捷的特點。在Java開發(fā)中,我們常常需要對集合進行復制(拷貝)操作。但是,拷貝操作并不是簡單的復制,而應該分為淺拷貝和深拷貝兩種不同的方式,本文將分別介紹Java中集合的淺拷貝和深拷貝

    2024年02月07日
    瀏覽(20)
  • 2023Java 崗面試,進互聯(lián)網(wǎng)大廠必備 Java 面試八股文真題解析

    2023Java 崗面試,進互聯(lián)網(wǎng)大廠必備 Java 面試八股文真題解析

    前言 一般技術面試官都會通過自己的方式去考察程序員的技術功底與基礎理論知識。 很多時候,面試官問的問題會和自己準備的“題庫”中的問題不太一樣,即使做了復盤,下次面試還是不知道該從何處下手。 為此鄙人軟磨硬泡才把阿里 P8 專門歸納整理的 《Java 進階知識典

    2024年02月15日
    瀏覽(35)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包