Java深拷貝與淺拷貝技術解析及實例演示

摘要:本文將詳細介紹Java中的深拷貝和淺拷貝概念,通過分析源碼和舉例說明,幫助讀者更好地理解這兩種拷貝方式的區別及應用場景。
一、深拷貝與淺拷貝的概念
深拷貝:復制一個對象后,無論是基本數據類型還是引用類型,都是重新創建的。簡單來說,深拷貝就是進行了完全徹底的復制。
淺拷貝:對基本數據類型進行拷貝時,是值傳遞;對引用數據類型進行拷貝時,只是進行了引用傳遞,沒有真實創建新的對象。
二、深拷貝與淺拷貝的實現

  1. 深拷貝
    Java中,所有的對象都繼承自Object類,Object類中提供了一個方法供我們對Java對象進行拷貝:clone()。要想成功調用這個方法,首先該類要實現Cloneable接口,并覆蓋clone()方法。
    深拷貝的實現過程如下:
    (1)實現Cloneable接口。
    (2)覆蓋Object類的clone()方法。
    (3)在clone()方法中,對基本類型數據進行值傳遞,對引用類型數據創建一個新的對象,并復制其內容。
  2. 淺拷貝
    Java中的淺拷貝則是僅對基本數據類型進行值傳遞,對引用數據類型進行引用傳遞。當引用類型數據發生變化時,淺拷貝的對象也會受到影響。
    三、實例演示
    下面通過一個具體的例子來演示深拷貝和淺拷貝的區別。
    假設有一個Person類,其中包含兩個屬性:一個整數類型的基本數據類型變量a,和一個String類型的引用數據類型變量b。
public class Person implements Cloneable {private int a;private String b;public Person(int a, String b) {this.a = a;this.b = b;}@Overrideprotected Object clone() throws CloneNotSupportedException {Person clonedPerson = (Person) super.clone();clonedPerson.a = a; // 基本數據類型值傳遞clonedPerson.b = (String) b.clone(); // 引用數據類型值傳遞return clonedPerson;}
}

現在創建兩個Person對象,分別進行深拷貝和淺拷貝。

public class Main {public static void main(String[] args) throws CloneNotSupportedException {Person person1 = new Person(1, "Hello");Person person2 = person1.clone();System.out.println("person1.a: " + person1.a);System.out.println("person2.a: " + person2.a);person1.b = "World";System.out.println("person1.b: " + person1.b);System.out.println("person2.b: " + person2.b);}
}

運行結果如下:

person1.a: 1
person2.a: 1
person1.b: World
person2.b: Hello

從這個例子可以看出,淺拷貝時,person2的b屬性受到了person1變化的影響;而深拷貝時,person2的b屬性獨立于person1,變化不會相互影響。
總結
深拷貝和淺拷貝在Java中有著明顯的區別。深拷貝進行了徹底的復制,無論是基本數據類型還是引用數據類型,都不會受到原對象的影響;而淺拷貝則只是對基本數據類型進行值傳遞,對引用數據類型進行引用傳遞,導致對象間的關系仍然存在,容易受到原對象的影響。在實際開發中,我們需要根據不同的場景選擇合適的拷貝方式,以滿足程序的設計需求。
來源:Java技術棧公眾號

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/160501.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/160501.shtml
英文地址,請注明出處:http://en.pswp.cn/news/160501.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

多柱漢諾塔問題

k柱漢諾塔 題目描述 漢諾塔(Hanoi Tower),又稱河內塔。 傳說大梵天創造世界的時候做了三根金剛石柱子,按左、中、右排序。大梵天在左側的柱子上,從下往上按照大小順序摞著64片黃金圓盤,越靠下的圓盤越大。…

個人博客項目 - 測試報告

文章目錄 一、項目背景二、測試報告功能測試1.編寫測試用例2.登錄測試3.編寫文章測試4.查看文章測試5.刪除文章測試7.注銷登錄測試 自動化測試性能測試1.VUG2.進行場景設計3.生成性能測試報告 總結 本文開始 一、項目背景 通過學習測試相關的知識,動手實踐并測試一…

2023 年 亞太賽 APMCM ABC題 國際大學生數學建模挑戰賽 |數學建模完整代碼+建模過程全解全析

當大家面臨著復雜的數學建模問題時,你是否曾經感到茫然無措?作為2022年美國大學生數學建模比賽的O獎得主,我為大家提供了一套優秀的解題思路,讓你輕松應對各種難題。 以五一杯 A題為例子,以下是咱們做的一些想法呀&am…

【Vue】自定義指令

自定義指令 自定義指令就是自己定義的指令,是對 DOM 元素進行底層操作封裝 ,程序化地控制 DOM,拓展額外的功能 全局定義 Vue.directive(指令名字, definition) 指令名:不包括v-前綴,使用時候包括v-,v-指令名defini…

CUTLASS 1.3.3中的 Volta884_h884gemm

CUTLASS 是 CUDA C 模板抽象的集合,用于在 CUDA 內的所有級別和規模上實現高性能矩陣-矩陣乘法 (GEMM) 和相關計算。它采用了類似于 cuBLAS 和 cuDNN 中實現的分層分解和數據移動策略。 CUTLASS 最新版本為3.3,相比1.3.3變動較大。然而重溫一下1.3.3仍然…

生產問題 Recv-Q101

生產上服務端口 Recv-Q101 新請求到服務器的失敗,幸好及時發現,通過重啟服務之后得到解決,具體原因等待排查 目前覺得的原因是:某些請求暫用時間比較久

Linux超簡單部署個人博客

1 安裝halo 1.1 切換到超級用戶 sudo -i 1.2 新建halo文件夾 mkdir ~/halo && cd ~/halo 1.3 編輯docker-compose.yml文件 vim ~/halo/docker-compose.yml 英文輸入法下,按 i version: "3"services:halo:image: halohub/halo:2.10container_…

2017年全國碩士研究生入學統一考試管理類專業學位聯考數學試題——解析版

文章目錄 2017 級考研管理類聯考數學真題解析一、問題求解(本大題共 5 小題,每小題 3 分,共 45 分)下列每題給出 5 個選項中,只有一個是符合要求的,請在答題卡上將所選擇的字母涂黑。真題(2017-…

Python 提高篇學習筆記(一):深拷貝和淺拷貝

文章目錄 一、什么是對象的引用二、深拷貝和淺拷貝2.1 淺拷貝(Shallow Copy)2.2 深拷貝(Deep Copy)2.3 copy.copy和copy.deepcopy的區別 一、什么是對象的引用 在 Python 中,對象的引用是指變量指向內存中某個對象的地址或標識符。當你創建一個新的對象(比如一個整…

[技術雜談]計算機系統硬件類名稱

在各種編程語言都可以見到利用WMI查詢計算機硬件信息,因此知道有哪些計算機硬件名稱非常有必要,下面列舉了所有計算機硬件名稱可以查詢。 本文內容 冷卻設備類輸入設備類大容量存儲類主板、控制器和端口類 顯示另外 6 個 計算機系統硬件類別將表示硬…

git修改遠程分支名稱

先拉取old_branch最新代碼到本地 git checkout old_branchgit pull origin old_branch本地修改后并推送 git branch -m old_branch new_branch # 修改分支名稱git push --delete origin old_branch # 刪除在遠程的老分支推送新分支 git push origin new_branch本地分支與遠…

除自身以外數組的乘積[中等]

優質博文:IT-BLOG-CN 一、題目 給你一個整數數組nums,返回數組answer,其中answer[i]等于nums中除nums[i]之外其余各元素的乘積。題目數據保證數組nums之中任意元素的全部前綴元素和后綴的乘積都在32位整數范圍內。請不要使用除法&#xff0…

【Qt開發流程】之富文本處理

描述 Scribe框架提供了一組類,用于讀取和操作結構化的富文本文檔。與Qt中以前的富文本支持不同,新的類集中在QTextDocument類上,而不是原始文本信息。這使開發者能夠創建和修改結構化的富文本文檔,而不必準備中間標記格式的內容。…

【數據結構】A : A DS圖_傳遞信息

A : A DS圖_傳遞信息 Description 小明在和他的小伙伴們玩傳消息游戲,游戲規則如下: 有n名玩家,所有玩家編號分別為0~n-1,其中小明編號為0;每個玩家都有固定的若干個可傳信息的其他玩家(也可能沒有)。傳消息的關系是…

busybox制作根文件系統2

上篇內容使用busybox制作好了根文件系統,接下來需要進行一些測試和功能的完善! 根文件系統的測試 測試根文件系統的時候不是直接燒寫到EMMC里面,這樣測試效率太低了,Ubuntu的rootfs目錄已經保存了根文件系統,只需要在…

向量數據庫,展望AGI時代

無論是向量數據庫,還是大模型,歸根結底,大家在追捧它時的心態,焦慮大于需求。 向量數據庫的熱潮,在一定程度上“外化”了人們的焦慮。 但這并不能否定向量數據庫的實際價值,甚至更長遠來看,向…

【C++】linux下的gdb程序調試

目錄 【C】Linux 下的 GDB 程序調試1. 安裝 GDB2. 編譯程序3. 啟動 GDB4. 設置斷點5. 執行程序6. 調試命令7. 調試崩潰8. 結束調試 【C】Linux 下的 GDB 程序調試 在開發 C 程序時,出現 bug 是常見的。調試是找出程序錯誤的關鍵步驟之一。在 Linux 環境下&#xff…

RedisTemplate使用詳解

RedisTemplate介紹StringRedisTemplate介紹RedisConnectionFactory介紹RedisConnectionFactory源碼解析 RedisOperations介紹RedisOperations源碼解析 RedisTemplate使用連接池配置RedisTemplate連接池連接池配置 RedisTemplate應用場景RedisTemplate主要特點RedisTemplate使用…

redis運維(十六) 有序集合

一 有序集合 把握一點: 各種redis 命令都提供各種語言對應的API 接口,后續API是關鍵 ① 概念 1、sorted set --> 有序集合2、redis有序集合也是集合類型的一部分,所以它保留了集合中元素不能重復的特性3、但是不同的是,有序集合給每個元素多設置…

什么是數字孿生?

數字孿生是指通過數字化技術手段,將現實世界中的實體物理系統或過程與其數字化模型相連接,實現實體物理系統或過程的虛擬仿真、監測、預測和優化等功能的一種技術。數字孿生技術可以將物理系統的運行狀態、性能參數、故障信息等實時反饋到數字模型中&…