Java基礎篇--淺拷貝和深拷貝

概念?

淺拷貝(Shallow Copy)和深拷貝(Deep Copy)是在對象復制過程中常用的概念。

  • 淺拷貝是指創建一個新對象,并將原始對象的非靜態字段的值拷貝到新對象中。如果字段是基本數據類型,直接復制其值;如果字段是引用類型,復制的是引用而不是對象本身。因此,在淺拷貝中,新舊對象共享引用類型字段所指向的對象。
  • 深拷貝是指創建一個新對象,并將原始對象的所有字段的值拷貝到新對象中,包括引用類型字段所指向的對象。通過深拷貝,可以實現兩個獨立的對象,彼此之間沒有任何關聯。修改其中一個對象的字段值不會影響另一個對象的字段值。

選擇使用淺拷貝還是深拷貝取決于實際需求。如果希望復制對象后的修改不會影響原始對象,應該使用深拷貝;如果可以接受復制對象的修改影響原始對象,或者對象較大且復制性能要求高,則可以使用淺拷貝。

綜上所述:

  1. 淺拷貝:

    • 對于簡單對象(如基本數據類型),直接復制其值。
    • 對于引用類型字段,復制其引用而不是對象本身。

    結果是,原始對象和復制對象之間共享相同的引用,對原始對象的修改會影響到復制對象,但是對于引用類型字段指向的對象本身的修改則不會影響。

  2. 深拷貝:

    • 對于簡單對象和引用類型字段,分別遞歸地創建它們的獨立副本,保證復制對象與原始對象完全獨立。

    結果是,原始對象和復制對象之間沒有任何引用關系,彼此獨立存在,修改其中一個對象不會影響另一個對象。

可以這么理解,從A這里復制出來了一個B,此時我修改了A的對象,而B的對象也跟著改變,這則是淺拷貝。相反,我修改了A的對象,而B的對象不跟著改變,這便是深拷貝。

示例代碼:

//創建一個類Person
class Person {String name;int age;// 構造函數public Person(String name, int age) {this.name = name;this.age = age;}// 重寫toString方法@Overridepublic String toString() {return "Person [name=" + name + ", age=" + age + "]";}
}public class myclass {public static void main(String[] args) {// 創建一個Person對象Person person1 = new Person("John", 25);// 淺拷貝示例Person person2 = person1; // 直接將person1的引用賦值給person2person2.age = 30; // 修改person2的屬性,也會影響到person1System.out.println("淺拷貝示例:");System.out.println("person1: " + person1);//運行結果:person1: Person [name=John, age=30]System.out.println("person2: " + person2);//運行結果:person2: Person [name=John, age=30]// 深拷貝示例Person person3 = new Person(person1.name, person1.age); // 創建新的Person對象,將person1的屬性值復制給person3person3.age = 35; // 修改person3的屬性,不會影響到person1System.out.println("深拷貝示例:");System.out.println("person1: " + person1);//運行結果:person1: Person [name=John, age=30]System.out.println("person3: " + person3);//運行結果:person3: Person [name=John, age=35]}
}

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

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

相關文章

開源數據庫Mysql_DBA運維實戰 (修改root密碼)

MySQL——修改root密碼的4種方法 本文以windows為例為大家詳細介紹下MySQL修改root密碼的4種方法,大家可以可以根據的自己的情況自由選擇,希望對大家有所幫助 方法1: 用SET PASSWORD命令 首先登錄MySQL。 格式:mysql> set pass…

Android APK體積優化(瘦身)

1、基礎知識: 1.1 apk結構 lib :存放so文件,對應不同的cpu架構 res :資源文件,layout、drawable等,經過aapt編譯 assets :資源文件,不經過aapt編譯 classes.dex :dx編譯…

爬蟲:使用Selenium模擬人工操作及獲取網頁內容

專欄介紹 結合自身經驗和內部資料總結的Python教程,每天3-5章,最短1個月就能全方位的完成Python的學習并進行實戰開發,學完了定能成為大佬!加油吧!卷起來! 全部文章請訪問專欄:《Python全棧教程(0基礎)》 再推薦一下最近熱更的:《大廠測試高頻面試題詳解》 該專欄對…

graphab 教程 ——生成廊道

Graphab軟件包括圖譜創建、基于圖譜的連通性計算、分析與推廣、制圖四個模塊。Graphab軟件的圖譜創建基于柵格數據進行,包括斑塊識別和連接建立兩個步驟。Graphab 軟件可識別的柵格數據格式包括TIFF、ASCI和RST,柵格像元記錄數值用于識別斑塊類型,識別規則可以選擇四鄰域或八鄰…

2-redis單節點搭建安裝

1.系統要求 本次redis四種模式(單機(standalone)模式、主從(master-slave)模式、哨兵(sentinel)模式、集群(cluster)模式)的搭建,以CentOS服務器進行。 類型版本CentOS7.9Redis7.0.121.1.OS基礎配置 CentOS為了能夠正常安裝redis,需要對CentOS進行常規的一些基礎配置,主要…

【Zabbix安裝-5.5版本】

Zabbix安裝(rpm包安裝) Index of /zabbix/zabbix/5.5/rhel/8/x86_64/ | 清華大學開源軟件鏡像站 | Tsinghua Open Source Mirror rpm包鏈接:https://mirrors.tuna.tsinghua.edu.cn/zabbix/zabbix/5.5/rhel/8/x86_64/zabbix-release-5.5-1.e…

Unity3d C#利用本地網頁快速打開螢石云監控視頻流(ezopen)實現云臺,聲音等控制,支持WebGL平臺,替代UMP播放(含源碼)

前言 之前我介紹了替代Universal?Media?PlayerUMP播放石云監控視頻流(ezopen)的功能,效果還是很明顯的,筆者的測試是差不多3-5秒就能打開監控畫面,不過稍微遺憾的是,之前的功能是iframe打開石云提供的播放網頁的形式&#xff0…

詳解攔截器和過濾器

目錄 代碼演示過濾器Demo攔截器Demo 過濾器自定義攔截器配置攔截器過濾器執行原理多個過濾器的執行順序 攔截器自定義攔截器注冊攔截器1)注冊攔截器2)配置攔截的路徑3)配置不攔截的路徑 多個攔截器的執行順序 過濾器和攔截器的區別 代碼演示 …

HarmonyOS教育類APP項目實戰系列課結課考試答案(1-10講)80分就合格

王丹輝(第一講):HarmonyOS教育類APP項目實戰開課及低代碼初體驗 結課考試 及格分80/ 滿分100 評價 判斷題 1. DevEco Studio不能同時支持HarmonyOS和OpenHarmony應用/服務開發 正確(True)錯誤(False) 回答正確 2. DevEco Studio…

C#基礎知識(一)

一、C#程序結構 《1》命名空間的聲明(namespace declaration) 《2》一個class 《3》class方法 《4》class屬性 《5》一個main方法 《6》語句(statements)&表達式(Expressions) 《7》注釋 注&#xff1a…

【設計模式】橋接模式

橋接(Bridge)是用于把抽象化與實現化解耦,使得二者可以獨立變化。這種類型的設計模式屬于結構型模式,它通過提供抽象化和實現化之間的橋接結構,來實現二者的解耦。 這種模式涉及到一個作為橋接的接口,使得…

C++ 網絡編程項目fastDFS分布式文件系統(二)-redis部分

目錄 1. 數據庫類型 1.1 基本概念 1.2 關系/非關系型數據庫搭配使用 2. Redis 2.1 基本知識點 2.2 redis常用命令 - String類型 - List類型 - Set類型 - SortedSet 類型 - Hash類型 Key 相關的命令 2.3 redis配置文件 2.4 redis數據持久化 3 hiredis的使用 1. 數據…

手搓vue3組件_0,打包配置

打包后引入項目是發現報錯: Cannot read properties of null (reading isCE) TypeError: Cannot read properties of null (reading isCE)這個是由于vue版本沖突問題, 這里我引入了自己打包的ui組件庫,但是ui組件庫中打包進入了自己的vue,那么在此時使用時,如果你引入的自己的組…

原生js發送ajax請求---ajax請求篇(一)

在原生js中我們使用的是XMLHttpRequest對象來發送ajax請求 主要步驟就是: 1.創建XMLHTTPRequest對象 2.使用open方法設置和服務器的交互信息 3.設置發送的數據,開始和服務器端交互 4.注冊事件 5.更新界面 (1) get方式 //步驟一…

使用python對圖像加噪聲

加上雨點噪聲 import cv2 import numpy as npdef get_noise(img, value10):#生成噪聲圖像>>> 輸入: img圖像value 大小控制雨滴的多少 >>> 返回圖像大小的模糊噪聲圖像noise np.random.uniform(0, 256, img.shape[0:2])# 控制噪聲水平&#xff…

誰能講清楚Spark之與MapReduce的對比

我們已經知道Spark是如何設計和實現數據處理流程的,這里我們 再深入思考一下,為什么Spark能夠替代MapReduce成為主流的大數據處理框架呢?對比MapReduce,Spark究竟有哪些優勢? 一 優勢 1 通用性: 基于函數式編程思想,MapReduce將數據類型抽象為,k,v格式,并將數據處理…

Spring Boot單元測試使用MockBean注解向Service注入Mock對象

1. 背景介紹 我們在測試時有一個Service,我們需要測試Service,但Service內部依賴ServiceA、ServiceB,此時我們希望Mock ServiceA,ServiceB 注入真實對象。 class Service {private ServiceA A;private ServiceB B;public int me…

OPENCV C++(十二)模板匹配

正常模板匹配函數 matchTemplate(img, templatee, resultMat, 0);//模板匹配 這里0代表的是方法,一般默認為0就ok img是輸入圖像 templatee是模板 resultmat是輸出 1、cv::TM_SQDIFF:該方法使用平方差進行匹配,因此最佳的匹配結果在結果為…

Excel(1):表頭或列頭凍結

1.需求 對于較大的excel,通常需要固定一部分內容,另一份內容為可翻動。 2.解決方式 在視圖中選擇凍結窗格,需要注意的是,選擇凍結窗格時,窗格的左上方的表格區域是固定不動的,只可以向下或者向右活動。

8.10論文閱讀

文章目錄 The multimodal MRI brain tumor segmentation based on AD-Net摘要本文方法損失函數 實驗結果 max-vit - unet:多軸注意力醫學圖像分割摘要本文方法實驗結果 The multimodal MRI brain tumor segmentation based on AD-Net 摘要 基于磁共振成像(MRI)的多模態膠質瘤…