【 java 基礎問題 第二篇 】

目錄

1.深拷貝和淺拷貝

1.1.區別

定義

定義

1.2.實現深拷貝的方式

2.泛型

2.1.定義

2.2.作用

?3.對象

3.1.創建對象的方式

3.2.對象回收

3.3. 獲取私有成員

4.反射

4.1.定義

4.2.特性

4.3.原理

5.異常

5.1.異常的種類

5.2.處理異常的方法

6.Object

6.1.等于與equals()區別

6.2.hashcode()與equals()關系

6.3String、StringBuffer、StringBuilder的區別

?7.序列化

7.1.JVM之間的傳遞對象

?8.設計模式

9.I/O

9.1.實現網絡IO高并發編程

9.2.BIO、NIO、AIO區別


1.深拷貝和淺拷貝

1.1.區別

例子:你需要將一個對象拷貝到一個新的對象里(類型相同),你選擇淺拷貝,那么它就是將對原先的對象原封不動的拷貝過去(引用類型共享內存地址),而深拷貝就是基本類型復制,引用類型是先創建一個新的對象再將值復制過來

區別:引用類型拷貝區別:淺拷貝將地址拷過來(地址復用),深拷貝將值拷過來(創建一個新的對象,地址不復用)

淺拷貝

定義
  • 基本類型字段:直接復制值。

  • 引用類型字段:僅復制內存地址(新舊對象共享同一引用對象)。

  • 特點:修改原對象或拷貝對象中的引用字段時,另一方會同步變化。

深拷貝

定義
  • 基本類型字段:直接復制值。

  • 引用類型字段:遞歸創建新對象并復制所有層級數據(新舊對象引用獨立對象)。

  • 特點:修改原對象或拷貝對象中的引用字段時,另一方不受影響。

1.2.實現深拷貝的方式

  • 實現?Cloneable 接口并重寫 clone() 方法
class Person implements Cloneable {String name;Address address;@Overridepublic Person clone() {try {Person cloned = (Person) super.clone();// 深拷貝:遞歸克隆引用字段cloned.address = this.address.clone();return cloned;} catch (CloneNotSupportedException e) {throw new AssertionError(); // 不會發生}}
}class Address implements Cloneable {String city;@Overridepublic Address clone() {try {return (Address) super.clone();} catch (CloneNotSupportedException e) {throw new AssertionError();}}
}class Person implements Cloneable {String name;Address address;@Overridepublic Person clone() {try {Person cloned = (Person) super.clone();// 深拷貝:遞歸克隆引用字段cloned.address = this.address.clone();return cloned;} catch (CloneNotSupportedException e) {throw new AssertionError(); // 不會發生}}
}class Address implements Cloneable {String city;@Overridepublic Address clone() {try {return (Address) super.clone();} catch (CloneNotSupportedException e) {throw new AssertionError();}}
}
  • 使用序列化和反序列化
import java.io.*;class Person implements Serializable {String name;Address address; // Address 也需實現 Serializable
}public class DeepCopyUtils {public static <T extends Serializable> T deepCopy(T obj) {try (ByteArrayOutputStream bos = new ByteArrayOutputStream();ObjectOutputStream oos = new ObjectOutputStream(bos)) {oos.writeObject(obj);try (ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());ObjectInputStream ois = new ObjectInputStream(bis)) {return (T) ois.readObject();}} catch (IOException | ClassNotFoundException e) {throw new RuntimeException("Deep copy failed", e);}}
}// 使用示例
Person original = new Person();
Person deepCopy = DeepCopyUtils.deepCopy(original);
  • 手動遞歸復制
class Person {String name;Address address;public Person deepCopy() {Person copy = new Person();copy.name = this.name;copy.address = this.address.deepCopy(); // 手動遞歸復制return copy;}
}class Address {String city;public Address deepCopy() {Address copy = new Address();copy.city = this.city;return copy;}
}// 使用示例
Person original = new Person();
Person deepCopy = original.deepCopy();

對比總結

方法性能代碼復雜度適用場景限制條件
Cloneable 接口中等簡單對象、可控的深拷貝需遞歸處理引用字段
序列化/反序列化復雜對象圖、完全深拷貝必須實現?Serializable
手動遞歸復制精細控制拷貝邏輯、排除特定字段代碼維護成本高

2.泛型

2.1.定義

泛型是java中的一個特性,它允許在定義類和方法和接口時只需要指定一個或者多個類型參數(泛型符號)就行,在使用時再指定具體的類型

2.2.作用

當多個類需要共享相同代碼邏輯時,可以通過定義泛型來實現。泛型允許在使用時指定具體類型,使不同類都能復用相同的代碼邏輯。

--------

由于泛型在定義時使用類型參數而非具體類型,它可以接收任何類型參數而無需強制類型轉換,從而避免了類型安全問題

?3.對象

3.1.創建對象的方式

  • 通過new關鍵字創建對象
  • 通過克隆創建對象
  • 通過反射創建對象
  • 通過反序列化創建對象

3.2.對象回收

對象是由垃圾回收器回收,垃圾回收器會在程序運行時自動運行,周期性去檢查對象是否被引用,沒有就直接回收,釋放內存

垃圾回收器實現的主要的機制:

----

1.引用計數法:它會根據該對象的引用計數,如果為0,代表沒有被引用直接回收釋放

---

2.可達性分析算法:它會從根對象出發,根據根對象的屬性和方法的引用鏈來判斷,如果這個對象沒有一個引用鏈那么代表沒有被引用,直接回收釋放內存

---

3.終結器:在對象里面你可以重寫finalize()方法,如果重寫了該方法,那么垃圾回收器在回收該對象之前會先執行該方法,但是會出現一個問題,你清楚你的這個對象什么時候被回收嗎?不確定時間,那么該方法執行的時間也不確定,因此會出現一些可能會出現的問題(?可能導致性能問題、死鎖和資源爭用),就比如性能問題,如果你在finalize()方法中釋放了某些資源,但是由于不確定時間釋放,就會導致一些性能問題(可能都不會釋放)

3.3. 獲取私有成員

由于定義的私有成員,那么只能該類內部訪問,如果外部需要訪問

  • 你對外提供方法來訪問(比getter方法)
  • 你通過反射直接獲取該成員

4.反射

4.1.定義

反射就是可以獲取任何一個類里面的全部信息(父類,實現的接口都可以),并且反射可以調用任何一個類里面的成員

4.2.特性

運行時類信息全知只要程序運行,那么通過反射就可以知道類里面全部信息
動態的創建對象由于你知道信息,那么你通過反射也可以創建對象
動態的調用方法也是因為知道全部信息,因此可以調用
訪問和修改字段值一樣

4.3.原理

編譯器會將源代碼先編譯成字節碼,然后JVM根據字節碼翻譯成機器碼,而反射就是通過字節碼從而知道類的全部信息

5.異常

5.1.異常的種類

5.2.處理異常的方法

  • 使用try-catch-fianlly(包裹可能會出現異常的代碼)

  • 手動拋出異常(throw)

  • 方法或類拋出異常(throws)

如果你使用try-catch-fianlly那么你需要注意:

當 try 代碼塊中的語句發生異常時,后續代碼將不會執行,異常會立即傳遞給 catch 塊。如果 catch 塊未能捕獲對應類型的異常,該異常會繼續向上層拋出(例如方法b拋出的異常可被調用它的方法a捕獲)。

----

catch接收到異常那么就會執行catch里面的對應代碼

----

如果定義了fianlly,不管有沒有異常,fianlly都會執行(常用于釋放鎖)

----

執行順序規則(fianlly,如果return在前,fianlly在后

  1. return?語句計算返回值:先將返回值存儲到臨時變量中。

  2. 執行?finally?塊:無論是否有?return?或異常,finally?都會執行。

  3. 方法返回臨時變量中的值:如果?finally?中沒有新的?return,則返回最初的值;如果?finally?中有?return,則會覆蓋原值。

6.Object

6.1.等于與equals()區別

等于就是:比較基本類型比值,比較引用類型比地址(比表面的)

而equals():你如果重寫了該方法,那么比較引用類型時比較里面的屬性值,沒有重寫與等于一樣

6.2.hashcode()與equals()關系

前提:你如果要重寫這其中的一個方法,那么另外一個也需要重寫(約定)

一致性:當equals()比較對象相等時,那么hashcode也一定相等(本質就是根據內部值計算出哈希值,而內部值都相等了,你的哈希值肯定相等)

不一致性:當hasjcode相等時,equals()不一定相等,因為你不同的對象計算出來的哈希值可能相同(哈希沖突)

6.3String、StringBuffer、StringBuilder的區別

1.可變性

-----

解釋:在Java中,String對象一旦創建就不可修改,具有不可變性。每次對String進行修改時,實際上都會創建一個新的String對象(數組也有類似特性)。

而StringBuffer、StringBuilder可變

2.線程安全性

---

解釋:由于String不可變,因此天然的線程安全,?而StringBuilder是線程不安全的(單線程來訪問最好),StringBuffer是線程安全的,其內部方法(在StringBuilder方法上)實現了悲觀鎖synchronized

3.性能

----

解釋:由于String每次修改就需要創建一個新的對象,因此性能低,?StringBuffer由于內部方法實現了鎖(而鎖本身就會影響性能),因此性能一般,StringBuilder性能最

?7.序列化

7.1.JVM之間的傳遞對象

1.使用序列化和反序列化

---

解釋:你先通過序列化將對象序列化成字節流存入文件中,再將文件傳輸,接收到文件后再將文件反序列化成對象即可

2.使用消息隊列

---

解釋:使用消息隊列(?RabbitMQ、Kafka)來傳遞消息,另一邊接收消息即可?

3.使用遠程方法(RPC)

4.使用數據庫(MYSQL)或緩存(Redis)

---

解釋:比如將對象之間存入數據庫或緩存中,直接訪問數據即可?

?8.設計模式

代理模式:

  • 目的:控制對象的訪問或增加一些新的方法
  • 內容:抽象主題,真實主題,代理三個角色

適配器模式:

  • 目的:轉換接口,是不兼容的類可以并行執行
  • 內容:目標接口,適配器,被適配對象

9.I/O

9.1.實現網絡IO高并發編程

使用NIO,NIO是同步非阻塞執行的,NIO 是基于I/O多路復用實現的,它可以只用一個線程處理多個客戶端I/O,如果你需要同時管理成千上萬的連接,但是每個連接只發送少量數據,例如一個聊天服務器,用NIO實現會更好一些。

9.2.BIO、NIO、AIO區別

BIO同步阻塞式執行
NIO同步非阻塞執行
AIO異步非阻塞執行

解釋:

  • 同步阻塞式執行:就是說你發完一個消息后,你會一直等待別人回你消息,并且在等待的過程中不會干任何事情
  • 同步非阻塞執行:就是說你發完一個消息后,你會一直等待別人回你消息,但是在等待的過程中你可以做一些自己的事情
  • 異步非阻塞執行:就是說你發完一個消息后,你不會等待別人回你消息

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

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

相關文章

Kafka 入門指南與一鍵部署

Kafka 介紹 想象一下你正在運營一個大型電商平臺&#xff0c;每秒都有成千上萬的用戶瀏覽商品、下單、支付&#xff0c;同時后臺系統還在記錄用戶行為、更新庫存、處理物流信息。這些海量、持續產生的數據就像奔騰不息的河流&#xff0c;你需要一個強大、可靠且實時的系統來接…

湖北理元理律師事務所:企業債務重組的風險控制方法論

一、擔保鏈破解&#xff1a;阻斷債務傳染的核心技術 2023年武漢某建材公司案例&#xff1a; 原始債務結構&#xff1a; A公司&#xff08;主債務人&#xff09;欠款200萬 ↓ B公司&#xff08;擔保人&#xff09;←連帶責任觸發執行 ↓ C公司&#xff08;B公司擔…

如何在CloudCompare中打開pcd文件

你只需要將pcd文件的路徑改在全英文路徑下&#xff0c;CloudCompare就可以打開。若含中文&#xff0c;就會報錯&#xff1a;

中醫的十問歌和脈象分類

中醫核心理論框架如下 診斷技術如下 本文主要介紹問診和切診。 十問歌的“十”是虛指&#xff0c;實際包含12個核心問題&#xff0c;脈象28種中常見僅10余種&#xff0c;重點解釋脈診的物理本質&#xff08;血流動力學觸覺感知&#xff09; 以下是中醫十問歌的完整內容及脈…

基于智能代理人工智能(Agentic AI)對沖基金模擬系統:模范巴菲特、凱西·伍德的投資策略

股票市場涉及眾多統計數據和模式。股票交易基于研究和數據驅動的決策。人工智能的使用可以實現流程自動化&#xff0c;讓投資者在研究上花費更少的時間&#xff0c;同時提高準確性。這使他們能夠更加專注于監督實際交易和服務客戶。 頂尖對沖基金經理發揮著至關重要的作用&…

大二下期末

一.Numpy&#xff08;Numerical Python&#xff09; Numpy庫是Python用于科學計算的基礎包&#xff0c;也是大量Python數學和科學計算包的基礎。不少數據處理和分析包都是在Numpy的基礎上開發的&#xff0c;如后面介紹的Pandas包。 Numpy的核心基礎是ndarray&#xff08;N-di…

D3ctf-web-d3invitation單題wp

#注入 #用kali構造憑證訪問MinIO服務器 #用mc帶臨時憑證訪問遠程Minion的儲存桶 還有一個 minio 服務的api&#xff0c;我們后面要用 /static/js/tools.js function generateInvitation(user_id, avatarFile) {if (avatarFile) {object_name avatarFile.name;genSTSCreds(ob…

基于 Vue 和 Spring Boot 實現滑塊驗證碼的機器驗證

基于 Vue 和 Spring Boot 實現滑塊驗證碼的機器驗證 需求概述技術選型前端實現1. 引入組件2. 修改后端請求URL3. 新增機器驗證頁面4.首頁調用驗證組件 后端實現流程梳理具體實現1. 引入依賴2. 增加yml配置3. 代碼實現4.跨域配置&#xff08;可選&#xff09; 實現效果二次驗證的…

[Java惡補day13] 53. 最大子數組和

休息了一天&#xff0c;開始補上&#xff01; 給你一個整數數組 nums &#xff0c;請你找出一個具有最大和的連續子數組&#xff08;子數組最少包含一個元素&#xff09;&#xff0c;返回其最大和。 子數組是數組中的一個連續部分。 示例 1&#xff1a; 輸入&#xff1a;nums …

sql server如何創建表導入excel的數據

在 SQL Server 中&#xff0c;可以通過幾種方式將 Excel 數據導入到數據庫表中。下面是一個完整的流程&#xff0c;包括如何創建表&#xff0c;以及將 Excel 數據導入該表的方法&#xff1a; ? 方法一&#xff1a;使用 SQL Server Management Studio (SSMS) 的導入向導&#x…

C++單例模式教學指南

C單例模式完整教學指南 &#x1f4da; 目錄 [單例模式基礎概念][經典單例實現及問題][現代C推薦實現][高級話題&#xff1a;雙重檢查鎖][實戰應用與最佳實踐][總結與選擇指南] 1. 單例模式基礎概念 1.1 什么是單例模式&#xff1f; 單例模式&#xff08;Singleton Pattern&…

使用xdocreport導出word

之前java總用freemaker進行導出&#xff0c;但是改xml實在是太繁瑣了&#xff0c;這次找了另一個工具進行體驗. 一、簡單導出 pom引入 <dependency><groupId>fr.opensagres.xdocreport</groupId><artifactId>fr.opensagres.xdocreport.core</arti…

vscode里如何用git

打開vs終端執行如下&#xff1a; 1 初始化 Git 倉庫&#xff08;如果尚未初始化&#xff09; git init 2 添加文件到 Git 倉庫 git add . 3 使用 git commit 命令來提交你的更改。確保在提交時加上一個有用的消息。 git commit -m "備注信息" 4 …

C++.OpenGL (2/64)你好,三角形(Hello Triangle)

你好,三角形(Hello Triangle) 繪制流程概覽 #mermaid-svg-MvIGIovxiuKVfzy8 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-MvIGIovxiuKVfzy8 .error-icon{fill:#552222;}#mermaid-svg-MvIGIovxiuKVfzy8 .error…

汽車安全體系:FuSa、SOTIF、Cybersecurity 從理論到實戰

汽車安全&#xff1a;功能安全&#xff08;FuSa&#xff09;、預期功能安全&#xff08;SOTIF&#xff09;與網絡安全(Cybersecurity) 從理論到實戰的安全體系 引言&#xff1a;自動駕駛浪潮下的安全挑戰 隨著自動駕駛技術從L2向L4快速演進&#xff0c;汽車安全正從“機械可靠…

N2語法 列挙、話題提出

1&#xff0c;&#xff5e;やら&#xff5e;やら  接続&#xff1a;名詞、辭書形  意味&#xff1a;…啦…啦&#xff08;列舉代表性的事物&#xff09;  例文&#xff1a;     家に帰って料理やら洗濯やら何もしなければならない。     帰國前、買い物やら荷造りや…

深入理解React Hooks的原理與實踐

深入理解React Hooks的原理與實踐 引言 React Hooks 自 2018 年 React 16.8 發布以來&#xff0c;徹底改變了前端開發者的編碼方式。它通過函數式組件提供了狀態管理和生命周期等功能&#xff0c;取代了傳統的類組件&#xff0c;使得代碼更加簡潔、復用性更強。然而&#xff…

RockyLinux9.6搭建k8s集群

博主介紹&#xff1a;?全網粉絲5W&#xff0c;全棧開發工程師&#xff0c;從事多年軟件開發&#xff0c;在大廠呆過。持有軟件中級、六級等證書。可提供微服務項目搭建與畢業項目實戰&#xff0c;博主也曾寫過優秀論文&#xff0c;查重率極低&#xff0c;在這方面有豐富的經驗…

鏈游技術破壁:NFT資產確權與Play-to-Earn經濟模型實戰

鏈游技術破壁&#xff1a;NFT資產確權與Play-to-Earn經濟模型實戰 ——從「投機泡沫」到「可持續生態」的技術重構 一、NFT確權技術革新&#xff1a;從鏈上存證到動態賦權 跨鏈確權架構 全鏈互操作協議&#xff1a;采用LayerZero協議實現以太坊裝備與Solana土地的跨鏈組合&…

Java下載文件(特殊字符編碼處理)

當你在這個問題上花費了數小時而解決不了&#xff0c;你才會知道這篇文章對你的幫助 import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.io.Resource; import org.springframework.http.HttpEntity; import org.springframewo…