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

面試官:深拷貝與淺拷貝有啥區(qū)別?

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

1.前言

首先,明確一點深拷貝和淺拷貝是針對對象屬性為對象的,因為基本數(shù)據(jù)類型在進行賦值操作時(也就是拷貝)是直接將值賦給了新的變量,也就是該變量是原變量的一個副本,這個時候你修改兩者中的任何一個的值都不會影響另一個,而對象或者引用數(shù)據(jù)來說在進行淺拷貝時,只是將對象的引用復(fù)制了一份,也就內(nèi)存地址;即兩個不同的變量指向了同一個內(nèi)存地址,那么在改變?nèi)我粋€變量的值都是改變這個內(nèi)存地址所指向的值,所以兩個變量的值都會改變。
上方這句話不太好理解,這樣,我把他們區(qū)別出來,做兩個講解,一個是關(guān)于基本類型的拷貝;一個關(guān)于引用數(shù)據(jù)類型的拷貝,分開理解,會大大降低學(xué)習(xí)成本~

2.基本類型的拷貝

在基本類型的拷貝中,深拷貝淺拷貝的作用就沒什么區(qū)別了,拷貝出來的對象都是擁有相同的數(shù)值,這里用語言文字很難描述,可以看下面的代碼和圖來幫助理解。

    public static void main(String[] args) throws CloneNotSupportedException {
        //原來的對象
        Person person1=new Person("張三",15);
        //克隆出來的對象
        Person person2=(Person) person1.clone();
    }

我們打印這兩個對象的地址:
觀察可以看出,他兩個的地址是不相同的,也就是說,他兩個現(xiàn)在是不同的對象。
面試官:深拷貝與淺拷貝有啥區(qū)別?
他兩個在堆、棧圖中是如何表示的呢?看下方的圖:
我們可以看出,p2p1中的所有數(shù)據(jù)都重新生成了一份,讓給讓p2指向新生成的那份數(shù)據(jù)。
面試官:深拷貝與淺拷貝有啥區(qū)別?

3.引用類型的拷貝

這個就很有引用類型拷貝就會在深拷貝淺拷貝上區(qū)別很大了!
我們?nèi)匀灰匀藖砼e例子,人身上一般都會帶著money,我們給人添加一個新的成員變量(錢),并且我們讓錢這個成員變量改為引用變量

3.1 關(guān)于引用類型的淺拷貝


class Money {
    public double value=99.99;


}

class Person implements Cloneable{
    public String name;
    public int age;
    public Money money=new Money();

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    @Override
    protected Object clone() throws CloneNotSupportedException {
        return super.clone();
    }
}
public class testDemo2 {

    public static void main(String[] args) throws CloneNotSupportedException {
        //原來的對象
        Person person1=new Person("張三",15);
        //克隆出來的對象
        Person person2=(Person) person1.clone();
        System.out.print("p1的錢錢數(shù):");
        System.out.println(person1.money.value);
        
        System.out.print("p2的錢錢數(shù):");
        System.out.println(person2.money.value);
    }
}

打印出來的結(jié)果:

p1的錢錢數(shù):99.99
p2的錢錢數(shù):99.99

我們可以觀察結(jié)果得出,p1的錢錢和p2的錢錢我們設(shè)置好的99.99。
當我們?nèi)L試修改p1錢錢的數(shù)時:

public static void main(String[] args) throws CloneNotSupportedException {
        //原來的對象
        Person person1=new Person("張三",15);
        //克隆出來的對象
        Person person2=(Person) person1.clone();

        System.out.println("修改p1的錢錢數(shù)");
        person1.money.value=50;

        System.out.print("p1的錢錢數(shù):");
        System.out.println(person1.money.value);

        System.out.print("p2的錢錢數(shù):");
        System.out.println(person2.money.value);
    }

代碼打印結(jié)果:
面試官:深拷貝與淺拷貝有啥區(qū)別?
我去,你修改p1的錢錢數(shù),為啥我p2的錢錢數(shù)也發(fā)送了改變,這不就相當于別人花的錢扣在了我身上?這可不是我想要的結(jié)果!
這到底怎能回事?其實很好理解,當我們在進行拷貝時,我們拷貝money這個成員變量時,我們拷貝的數(shù)值是一個引用變量,這個引用變量又指向一個對象。因此當我們修改p1的錢的數(shù)值時,我們時順著引用變量找所指向的值將其修改了,又因為兩個引用對象指向同一個值,因此修改后,再通過引用變量查看值,就是修改后的值了;上述過程就是淺拷貝了,它的結(jié)構(gòu)圖如下:
面試官:深拷貝與淺拷貝有啥區(qū)別?

3.2 關(guān)于引用類型的深拷貝

如何解決這樣的問題呢?其實很簡單,當我們進行拷貝時,我們讓引用變量引用的對象重新創(chuàng)建一個新的對象,并且讓拷貝的那一份的引用變量指向創(chuàng)建的對象。
我們主要修改的就算Person類中的clone方法,我們先讓Money類實現(xiàn)Cloneable接口,然后在Person類中的clone方法調(diào)用Money類中的clone方法。(這里比較繞,看不懂沒關(guān)系,下面有畫的結(jié)構(gòu)圖,圖看起來會很好理解!)


class Money implements Cloneable{
    public double value=99.99;

    @Override
    protected Object clone() throws CloneNotSupportedException {
        return super.clone();
    }
}

class Person implements Cloneable{
    public String name;
    public int age;
    public Money money=new Money();

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    @Override
    protected Object clone() throws CloneNotSupportedException {
        Person person=(Person) super.clone();
        person.money=(Money) person.money.clone();
        return person;
    }
}
public class testDemo2 {

    public static void main(String[] args) throws CloneNotSupportedException {
        //原來的對象
        Person person1=new Person("張三",15);
        //克隆出來的對象
        Person person2=(Person) person1.clone();

        System.out.println("修改p1的錢錢數(shù)");
        person1.money.value=50;

        System.out.print("p1的錢錢數(shù):");
        System.out.println(person1.money.value);

        System.out.print("p2的錢錢數(shù):");
        System.out.println(person2.money.value);
    }
}

代碼運行出來的結(jié)果:
可以看出,修改p1的錢數(shù),不在應(yīng)用p2的錢數(shù)了。
面試官:深拷貝與淺拷貝有啥區(qū)別?
上方這個過程就是深拷貝,深拷貝的結(jié)構(gòu)圖如下:
面試官:深拷貝與淺拷貝有啥區(qū)別?文章來源地址http://www.zghlxwxcb.cn/news/detail-468626.html

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

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

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • Java中的深拷貝與淺拷貝

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

    2024年01月22日
    瀏覽(40)
  • 簡單理解Python中的深拷貝與淺拷貝

    I. 簡介 深拷貝會遞歸的創(chuàng)建一個完全獨立的對象副本, 包括所有嵌套的對象 ,而淺拷貝只 復(fù)制嵌套對象的引用 ,不復(fù)制嵌套對象本身。 簡單來說就是兩者都對原對象進行了復(fù)制,因此使用is運算符來比較新舊對象時,返回的都是False(都開辟了新的內(nèi)存);兩者區(qū)別在于 對嵌

    2024年02月12日
    瀏覽(19)
  • Java中的集合及深拷貝與淺拷貝

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

    Java是一種面向?qū)ο蟮木幊陶Z言,其中集合是常用的數(shù)據(jù)結(jié)構(gòu)之一,具有方便快捷的特點。在Java開發(fā)中,我們常常需要對集合進行復(fù)制(拷貝)操作。但是,拷貝操作并不是簡單的復(fù)制,而應(yīng)該分為淺拷貝和深拷貝兩種不同的方式,本文將分別介紹Java中集合的淺拷貝和深拷貝

    2024年02月07日
    瀏覽(20)
  • 【Python】python深拷貝與淺拷貝詳解(必須掌握)

    深拷貝和淺拷貝是python必須要掌握的內(nèi)容,無論你是面試開發(fā)、測試、運維等職位,只要是python,深拷貝與淺拷貝是面試官常問的一個重要知識點。 (關(guān)注“測試開發(fā)自動化” 弓中皓,獲取更多學(xué)習(xí)內(nèi)容) 相同點: 無論深拷貝還是淺拷貝都會創(chuàng)建一個新對象。即:拷貝出來

    2024年03月25日
    瀏覽(26)
  • Java面試必備:深拷貝、淺拷貝、引用拷貝的區(qū)別

    Java中的拷貝可以分為深拷貝(Deep Copy)、淺拷貝(Shallow Copy)和引用拷貝(Reference Copy)。它們之間的區(qū)別如下: 淺拷貝: 只復(fù)制對象本身,而不復(fù)制對象包含的子對象。新舊對象之間共享子對象的引用,即新對象和原始對象中的子對象指向同一個內(nèi)存地址。 淺拷貝:使用

    2023年04月11日
    瀏覽(25)
  • 深入探索前端之道:JavaScript深拷貝與淺拷貝的解析與實現(xiàn)

    前端開發(fā)中,數(shù)據(jù)的復(fù)制是一個常見的操作。尤其是在處理對象和數(shù)組時,我們需要考慮的是一個淺拷貝還是深拷貝。那么,什么是深拷貝和淺拷貝?它們在前端開發(fā)中有什么作用?如何實現(xiàn)這兩種拷貝?這是我們在本文將討論的問題。 淺拷貝 淺拷貝是一種數(shù)據(jù)復(fù)制方式,

    2024年02月10日
    瀏覽(24)
  • 服務(wù)器和電腦有啥區(qū)別?

    服務(wù)器和電腦有啥區(qū)別?

    服務(wù)器可以說是“高配的電腦”,兩者都有CPU、硬盤、電源等基礎(chǔ)硬件組成,但服務(wù)器和電腦也是有一定區(qū)別的,讓小編帶大家了解一下吧! #秋天生活圖鑒# 1、穩(wěn)定性需求不同:服務(wù)器是全年無休,需要高穩(wěn)定性,很多時候服務(wù)器就只有一次開機機會,接著就要提供高強度

    2024年02月01日
    瀏覽(30)
  • TCP 和UDP 到底有啥區(qū)別

    TCP(傳輸控制協(xié)議)和UDP(用戶數(shù)據(jù)報協(xié)議)是互聯(lián)網(wǎng)上常用的兩種傳輸層協(xié)議,它們在數(shù)據(jù)傳輸方式和特性上有顯著的區(qū)別。下面是TCP和UDP的主要區(qū)別: 連接性 : TCP 是一種面向連接的協(xié)議。在數(shù)據(jù)傳輸前,它需要在發(fā)送方和接收方之間建立一個連接。這個過程通常涉及一

    2024年02月03日
    瀏覽(21)
  • CISAW認證,與CISP認證有啥區(qū)別?

    CISAW(信息安全保障人員認證)是CCRC(中國網(wǎng)絡(luò)安全審查技術(shù)與認證中心)推出的一個證書。 CISP是國家信息安全測評中心推出的一個證書。 這兩個機構(gòu)都可以頒發(fā)信息安全服務(wù)相關(guān)資質(zhì),它倆沒有直接關(guān)系。 兩個機構(gòu)都推出了信息安全相關(guān)的證書,一個是CISAW,一個是CIS

    2024年02月10日
    瀏覽(19)
  • 深入與淺談 Vue 中計算屬性和偵聽器的區(qū)別和使用(Vue3版本為例)

    深入與淺談 Vue 中計算屬性和偵聽器的區(qū)別和使用(Vue3版本為例)

    #五一技術(shù)創(chuàng)作馬拉松# 計算屬性 computed 和偵聽器 watch 都是 Vue.js 框架中用來響應(yīng)式更新視圖的重要概念。在 Vue 項目開發(fā)中,這兩個技術(shù)點是非常重要的,同時也是 Vue 基礎(chǔ)中不可缺少的知識點。在面試中,計算屬性 computed 和偵聽器 watch 也是經(jīng)常出現(xiàn)的考點,作為前端開發(fā)也

    2024年02月07日
    瀏覽(24)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包