Java深拷貝與淺拷貝核心解析

Java深拷貝與淺拷貝的概念

淺拷貝(Shallow Copy)只復制對象的引用,而不復制對象本身。拷貝后的對象和原對象共享同一塊內存地址中的子對象。修改其中一個對象的非基本類型屬性時,另一個對象的對應屬性也會被修改。

深拷貝(Deep Copy)會復制對象及其所有子對象,生成一個完全獨立的新對象。拷貝后的對象和原對象完全分離,修改其中一個對象的屬性不會影響另一個對象。

內存分析示例

假設有一個Person類,包含nameString)和addressAddress類)屬性:

class Address {String city;// 構造方法、getter/setter省略
}class Person implements Cloneable {String name;Address address;@Overrideprotected Object clone() throws CloneNotSupportedException {return super.clone(); // 默認淺拷貝}
}

淺拷貝實現與內存表現

Person p1 = new Person();
p1.name = "Alice";
p1.address = new Address("Beijing");Person p2 = (Person)p1.clone();

內存表現:

  • p1p2是兩個獨立對象,但它們的address屬性指向同一個Address對象
  • 修改p2.address.city會影響p1.address.city

深拷貝實現方式

方法1:重寫clone()
@Override
protected Object clone() throws CloneNotSupportedException {Person cloned = (Person)super.clone();cloned.address = (Address)this.address.clone(); // 遞歸克隆引用對象return cloned;
}

方法2:序列化實現
public Person deepCopy() throws IOException, ClassNotFoundException {ByteArrayOutputStream bos = new ByteArrayOutputStream();ObjectOutputStream oos = new ObjectOutputStream(bos);oos.writeObject(this);ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());ObjectInputStream ois = new ObjectInputStream(bis);return (Person)ois.readObject();
}

內存表現:

  • p1p2完全獨立,包括所有引用類型屬性
  • 修改p2.address.city不會影響p1.address.city

性能與適用場景

淺拷貝:

  • 性能更好,僅復制引用
  • 適合引用對象不可變或不需要獨立修改的場景

深拷貝:

  • 性能開銷較大,需要遞歸復制所有對象
  • 適合需要完全獨立對象的場景,如多線程環境

注意事項

  1. String等不可變對象在淺拷貝中是安全的
  2. 數組的clone()方法是淺拷貝
  3. 深拷貝可能導致循環引用問題
  4. 使用第三方庫(如Apache Commons Lang的SerializationUtils)可以簡化深拷貝實現

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

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

相關文章

DBeaver 的 PostgreSQL 驅動包默認存儲位置

在 Windows 系統中,DBeaver 的 PostgreSQL 驅動包(JDBC 驅動 JAR 文件)默認存儲位置如下: ###🔍 默認驅動安裝路徑 C:\Users\你的用戶名\AppData\Roaming\DBeaverData\drivers說明:你的用戶名:…

大數據畢業設計選題推薦:基于北京市醫保藥品數據分析系統,Hadoop+Spark技術詳解

🍊作者:計算機畢設匠心工作室 🍊簡介:畢業后就一直專業從事計算機軟件程序開發,至今也有8年工作經驗。擅長Java、Python、微信小程序、安卓、大數據、PHP、.NET|C#、Golang等。 擅長:按照需求定制化開發項目…

Package.xml的字段說明

package.xml 的版本說明 <package format"2"></package>每一個 package.xml 都以作為 root 標簽&#xff0c;其中 format 代表版本,現在主要是版本 2 為主,與版本 1 之間的差別主要是一些子標簽, package.xml 的必備標簽 name:功能包名 version:版本號。…

JAVA【抽象類】和【接口】

在面向對象編程中&#xff0c;接口&#xff08;Interface&#xff09;和抽象類&#xff08;Abstract Class&#xff09;都是用于實現抽象化的機制&#xff0c;但它們在設計目的、語法規則和使用場景上有顯著區別。以下是它們的核心區別&#xff1a; 1. 定義與關鍵字接口&#x…

Mysql系列--11、使用c/c++訪問mysql服務

目錄 一、準備 測試 二、創建對象 三、連接Mysql服務 四、下達指令 3.1增刪改 增加 編碼格式 刪除 修改 3.2查詢結果 結構體理解 打印屬性 打印數據 前面我們已經學習并練習了本地命令行形式的sql語句的使用&#xff0c;可在以后開發中我們一般 不會直接命令行操作數據庫&…

CS144 lab3 tcp_sender

0. 前言 這個實驗做了挺久的&#xff0c;剛開始做的時候官方的代碼庫還是開著的。 調著調著代碼官方把倉庫給刪掉了&#xff0c;又去找別人的代碼倉庫調發現不 對都打算放棄了&#xff0c;過了幾天發現了一個start-code的庫 再合進去簡直完美。這個實驗花的時間應該是前四個里面…

華為HCIP數通學習與認證解析!

大家好&#xff0c;這里是G-LAB IT實驗室。在信息技術飛速發展的今天&#xff0c;隨著華為產品和服務的廣泛應用&#xff0c;成為一名華為數通工程師無疑是許多年輕從業者的目標。然而&#xff0c;對于許多人來說&#xff0c;面對令人眼花繚亂的華為認證體系&#xff0c;不禁要…

深度學習入門Day10:深度強化學習原理與實戰全解析

一、開篇&#xff1a;智能決策的科學與藝術在前九天的學習中&#xff0c;我們掌握了處理各種數據類型的深度學習方法&#xff0c;但這些都屬于"被動學習"——模型從靜態數據中學習模式。今天&#xff0c;我們將進入一個全新的領域&#xff1a;強化學習&#xff08;Re…

Jenkins Pipeline(二)-設置Docker Agent

設計流水線的目的是更方便地使用 Docker鏡像作為單個 Stage或整個流水線的執行環境。 1.安裝必要插件 在Jenkins服務器上已經安裝了插件。 Docker PipelinePipeline Maven IntegrationPipeline Maven Plugin API 如果插件缺少什么&#xff0c;再次檢查并安裝即可。 2. 配…

神經網絡|(十六)概率論基礎知識-伽馬函數·中

【1】引言 前序學習進程中&#xff0c;已經初步了解了伽馬函數&#xff0c;認識到nnn的階乘計算可以轉化為&#xff1a; n!n!?limk→∞kn?k!(nk)!limk→∞kn?k!?n!(nk)!limk→∞kn?k!(n1)(n2)...(nk)n!n! \cdot lim_{k\rightarrow\infty}\frac{k^n\cdot k!}{(nk)!}\\lim_…

設計模式Books Reading

文章目錄 設計模式 創建型設計模式 工廠方法 示例說明 工廠方法模式結構 案例偽代碼 工廠方法模式適合應用 實現方式 工廠方法模式優缺點 與其他模式的關系 概念示例 抽象工廠 抽象工廠模式結構 抽象工廠模式適合應用場景 實現方式 抽象工廠模式優缺點 與其他模式的關系 代碼示…

接吻數問題:從球體堆疊到高維空間的數學奧秘

本文由「大千AI助手」原創發布&#xff0c;專注用真話講AI&#xff0c;回歸技術本質。拒絕神話或妖魔化。搜索「大千AI助手」關注我&#xff0c;一起撕掉過度包裝&#xff0c;學習真實的AI技術&#xff01; 1 接吻數問題概述 接吻數問題&#xff08;Kissing Number Problem&am…

深度學習③【卷積神經網絡(CNN)詳解:從卷積核到特征提取的視覺革命(概念篇)】

文章目錄先言1. 卷積核&#xff1a;特征檢測的魔法窗口1.1什么是卷積核&#xff1a;可學習的特征檢測器1.2可視化理解&#xff1a;邊緣檢測、紋理提取、特征發現1.3代碼實現&#xff1a;使用PyTorch定義和初始化卷積層2. 卷積運算的數學原理2.1.離散卷積計算&#xff1a;滑動窗…

當不想安裝telnet或nc時,可使用 Linux 系統默認自帶的bash原生網絡功能或ping(輔助判斷)測試連通性

1. 用bash原生/dev/tcp測試端口&#xff08;無需任何工具&#xff09;bashshell 內置了/dev/tcp虛擬設備&#xff0c;可直接通過腳本測試端口是否能連接&#xff0c;執行以下命令&#xff08;替換數據庫 IP 和端口&#xff09;&#xff1a;# 格式&#xff1a;echo > /dev/tc…

【STM32外設】ADC

聲明&#xff1a;上圖是STM32產品型號各字段含義&#xff0c;本文基于STM32F103 1、ADC的一些概念 常規通道(常規組)和注入通道(注入組)&#xff08;regular channels and injected channels&#xff09;ADC支持的外部通道總共16個&#xff08;且被3個ADC共享&#xff0c;ADC12…

Aha Moment——啊哈時刻!

1. 理解面試官的意圖面試官問你“Aha moment”&#xff0c;其實是想知道&#xff1a;你是否真正理解這個概念&#xff1a;不只是背定義&#xff0c;而是理解其為什么重要。你如何發現它&#xff1a;考察你的數據分析方法論和技術能力&#xff08;用了哪些數據、指標、模型&…

RAG教程5:多表示索引和ColBERT

文章目錄 導入依賴包 多表示索引 ColBERT 導入依賴包 %pip install youtube-transcript-api pytube多表示索引 from langchain_community.document_loaders import WebBaseLoader from langchain_text_splitters import RecursiveCharacterTextSplitterloader = WebBaseL

來自火山引擎的 MCP 安全授權新范式

資料來源&#xff1a;火山引擎-開發者社區 本文旨在深入剖析火山引擎 Model Context Protocol (MCP) 開放生態下的 OAuth 授權安全挑戰&#xff0c;并系統闡述火山引擎為此構建的多層次、縱深防御安全方案。面對由 OAuth 2.0 動態客戶端注冊帶來的靈活性與潛在風險&#xff0c;…

瑞芯微RK3506開發板PWM輸入捕獲驅動調試記錄

本文演示PWM輸入信號采集&#xff0c;基于觸覺智能RK3506開發板。配置為&#xff1a; 3核Cortex-A7Cortex-M0多核異構處理器 主要接口&#xff1a;2路CAN FD&#xff0c;5路串口&#xff0c;RGB、MIPI、音頻、USB2.0 OTG等、板載雙百兆網口4G星閃SLEWiFi6BLE5.2。 PWM信號簡…

PHP的header()函數分析

PHP的header()函數是HTTP協議交互的核心工具&#xff0c;它通過直接操縱響應頭實現服務器與客戶端之間的元數據通信。作為PHP原生函數&#xff0c;其設計初衷是處理HTTP協議層的關鍵操作&#xff0c;包括狀態碼設置、內容類型聲明和緩存控制等基礎功能。在Web開發中&#xff0c…