【數據結構】(3)包裝類和泛型

一、包裝類

1、什么是包裝類

? ? ? ? 將基礎類型包裝成的類就是包裝類。由于基礎類型不是繼承 Object 類的類,所以在泛型不能直接支持基礎類型,為了解決這個問題,就需要把基礎類型轉換為對應的包裝類

基礎類型對應的包裝類
基礎類型包裝類
byteByte
shortShort
intInteger
longLong
floatFloat
doubleDouble
charCharacter
booleanBoolean

2、裝箱和拆箱

裝箱:基礎類型轉換為包裝類。

拆箱:包裝類轉換為基礎類型。

以下為過時的寫法

3、自動裝箱和拆箱

????????我們現在用的都是自動裝箱、拆箱,第一種方式是最好的。

????????用 javap -v 命令反匯編字節碼文件,可以看到編譯器會自動添加 valueOf (裝箱)和 intValue(拆箱) 方法。

4、包裝類的常量緩沖池

? ? ? ? 同是比較有相同內容的對象的地址,結果卻不同:

? ? ? ? 這是因為 Integer 有一個常量池機制,當加載 Integer 類時,就會自動把 -128 ~ 127 范圍的對象(常用的數值)放到常量池中:

????????因此,i8、i9 引用都是存放的常量池中 127 對象的地址,而 i10、i11 引用分別存放不同的堆中新創建的對象的地址:

:128 并沒有超過 Integer 的取值范圍,它的范圍大概是 -21億 ~ 21 億。

包裝類的緩沖值范圍
包裝類緩沖值范圍
Byte-128 ~ 127
Short-128 ~ 127
Integer-128 ~ 127
Long-128 ~ 127
Float
Double
Character0 ~ 127
Booleantrue 和 false

二、泛型

1、什么是泛型

? ? ? ? 一般的類和方法只能固定接收、返回一種類型的數據,但有時我們希望接收、返回很多種類型的數據。比如寫一個加法器,里面的數據可以是整型、浮點型,如果使用方法重載,方法里的步驟相同,只是數據類型不同,造成代碼的冗余。使用泛型可以解決這個問題,相當于將數據類型參數化,可以給同一個類或方法靈活地指定任意類型

2、使用 Object 類

? ? ? ? 如果我們需要實現一個數組類,這個類中的數組成員可以存放任意類型的元素,并且有 set、get 指定位置的元素的方法。可以使用 Object 類,因為它是任意類的父親,通過任意類型向上轉型為 Object 類實現:

?

? ? ? ? 但是這種方法有個缺點,一是獲取值時需要手動強制類型轉換;二是無法確定一種類型,即讓類或方法在使用時持有一種類型,而不是同時擁有任意類型。而泛型不需要手動強制類型轉換,并且在創建對象時就將某一種類型作為參數傳入,指定其類型編譯器對其進行類型檢查。既能讓類指定不同的類型,又能給對象指定一種類型。

3、泛型的使用

? ? ? ? 將上面的類改寫成泛型:

  • ?<T> 表示該類為泛型類,類型形參常用的名稱有:

  • MyArray 中仍用 Object[] 類型創建對象,因為 T 只是泛型類的標志,它并沒有實際的構造函數

  • 在定義引用時,已確定為 String 類,?因此 new 對象時可根據上下文推導類型省略為 <>
  • 優點:編譯器自動進行類型轉換、類型檢查;一份代碼支持多種類型。

4、裸類型

? ? ? ? 泛型參數不指定,默認 T 為 Object,它只是為了兼容老版本,不建議使用:

? ? ? ? 我們學習泛型,重點不在定義泛型類,而在泛型類的實例化,后續使用 java 中的集合類時,會經常用到泛型的實例化

5、如何編譯泛型——擦除機制

? ? ? ? 編譯器先將泛型類型擦除,再替換為 Object 或邊界類型。set 中把指定類型轉為 Object (向上轉型),get 中強制轉換 Object 為指定類型(針對泛型類)。

? ? ? ? 最后針對子類重寫泛型父類的方法,避免沒有真正覆蓋父類方法,編譯器會自動生成橋接方法。

擦除前:

public class Node<T> {T data;public void setData(T data) {this.data = data;}
}
public class StringNode extends Node<String> {@Overridepublic void setData(String data) {super.setData(data);}
}

擦除后:

public class Node {Object data;public void setData(Object data) {this.data = data;}
}public class StringNode extends Node {// 形參中,子類的 String 與父類替換后的 Object 不一致// 未成功覆蓋@Overridepublic void setData(String data) { super.setData(data);}
}

自動生成橋接方法:

public class StringNode extends Node {// 子類與父類的方法簽名一致@Overridepublic void setData(Object data) {setData((String) data);}
}

6、泛型上界

? ? ? ? 對泛型的類型范圍的上界進行約束

? ? ? ? 在實現計算器時,使用泛型上界,可以限制類型為數字。若沒有 extends,默認為 extends Object。

7、泛型方法

? ? ? ? 將泛型寫到方法名后,返回值類型前,讓返回值類型、參數列表都能使用該泛型

? ? ? ? 泛型方法的使用,類型推導見上文 “泛型的使用” :

8、通配符

? ? ? ? 使泛型類引用能接收所有類型的泛型類對象:

三、總結

? ? ? ? 泛型的重點在泛型類對象怎么實例化,為后續集合類的使用做鋪墊。而怎么定義泛型類、怎么定義泛型方法、擦除機制、泛型上界、通配符等相比較下就不那么重要了。

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

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

相關文章

DBUtils中QueryRunner(空參,傳數據源)構造方法的區別及應用場景

關于學習Spring框架時重構DAO層時&#xff0c;遇到的QueryRunner構造方法的問題&#xff0c;回憶MySQL中DBUtils部分 1. 空參構造方法 new QueryRunner() 特點&#xff1a; 不綁定數據源&#xff1a;QueryRunner 實例內部沒有 DataSource&#xff0c;因此無法自動獲取連接。 …

C++11線程

C11提供了線程庫&#xff0c;下面我們來看一下如何使用。 線程的創建 頭文件 要創建一個線程需要包一個線程頭文件:#include <thread> 我們先來看看thread支持的構造方式。 支持默認構造&#xff0c;直接使用thread創建一個空的線程對象。 也支持帶參的構造&#x…

梯度提升用于高效的分類與回歸

人工智能例子匯總:AI常見的算法和例子-CSDN博客 使用 決策樹(Decision Tree) 實現 梯度提升(Gradient Boosting) 主要是模擬 GBDT(Gradient Boosting Decision Trees) 的原理,即: 第一棵樹擬合原始數據計算殘差(負梯度方向)用新的樹去擬合殘差累加所有樹的預測值重…

Golang 并發機制-3:通道(channels)機制詳解

并發編程是一種創建性能優化且響應迅速的軟件的強大方法。Golang&#xff08;也稱為 Go&#xff09;通過通道&#xff08;channels&#xff09;這一特性&#xff0c;能夠可靠且優雅地實現并發通信。本文將揭示通道的概念&#xff0c;解釋其在并發編程中的作用&#xff0c;并提供…

Unity開發游戲使用XLua的基礎

Unity使用Xlua的常用編碼方式&#xff0c;做一下記錄 1、C#調用lua 1、Lua解析器 private LuaEnv env new LuaEnv();//保持它的唯一性void Start(){env.DoString("print(你好lua)");//env.DoString("require(Main)"); 默認在resources文件夾下面//幫助…

筆記:使用ST-LINK燒錄STM32程序怎么樣最方便?

一般板子在插件上&#xff0c; 8腳 3.3V;9腳 CLK;10腳 DIO;4腳GND ST_Link 19腳 3.3V;9腳 CLK;7腳 DIO;20腳 GND 燒錄軟件&#xff1a;ST-LINK Utility&#xff0c;Keil_5; ST_Link 接口針腳定義&#xff1a; 按定義連接ST_Link與電路板&#xff1b; 打開STM32 ST-LINK Uti…

網絡測試工具

工具介紹&#xff1a; 這是一個功能完整的網絡測速工具&#xff0c;可以測試網絡的下載速度、上傳速度和延遲。 功能特點&#xff1a; 1. 速度測試 - 下載速度測試 - 上傳速度測試 - Ping延遲測試 - 自動選擇最佳服務器 2. 實時顯示 - 進度條顯示測試進度 - 實時顯示測試狀…

java每日精進1.31(SpringSecurity)

在所有的開發的系統中&#xff0c;都必須做認證(authentication)和授權(authorization)&#xff0c;以保證系統的安全性。 一、基礎使用 1.依賴 <dependencies><!-- 實現對 Spring MVC 的自動化配置 --><dependency><groupId>org.springframework.bo…

簡單的SQL語句的快速復習

語法的執行順序 select 4 字段列表 from 1 表名列表 where 2 條件列表 group by 3 分組前過濾 having 分組后過濾 order by 5 排序字段列表 limit 6 分頁參數 聚合函數 count 統計數量 max 最大值 min 最小值 avg 平均 sum 總和 分組查詢使…

《程序人生》工作2年感悟

一些雜七雜八的感悟&#xff1a; 1.把事做好比什么都重要&#xff0c; 先樹立量良好的形象&#xff0c;再橫向發展。 2.職場就是人情世故&#xff0c;但也不要被人情世故綁架。 3.要常懷感恩的心&#xff0c;要記住幫助過你的人&#xff0c;愿意和你分享的人&#xff0c;有能力…

17.2 圖形繪制8

版權聲明&#xff1a;本文為博主原創文章&#xff0c;轉載請在顯著位置標明本文出處以及作者網名&#xff0c;未經作者允許不得用于商業目的。 17.2.10 重繪 先看以下例子&#xff1a; 【例 17.28】【項目&#xff1a;code17-028】繪制填充矩形。 private void button1_Clic…

自定義數據集 使用pytorch框架實現邏輯回歸并保存模型,然后保存模型后再加載模型進行預測,對預測結果計算精確度和召回率及F1分數

import numpy as np import torch import torch.nn as nn import torch.optim as optim from sklearn.metrics import precision_score, recall_score, f1_score# 數據準備 class1_points np.array([[1.9, 1.2],[1.5, 2.1],[1.9, 0.5],[1.5, 0.9],[0.9, 1.2],[1.1, 1.7],[1.4,…

neo4j入門

文章目錄 neo4j版本說明部署安裝Mac部署docker部署 neo4j web工具使用數據結構圖數據庫VS關系數據庫 neo4j neo4j官網Neo4j是用ava實現的開源NoSQL圖數據庫。Neo4作為圖數據庫中的代表產品&#xff0c;已經在眾多的行業項目中進行了應用&#xff0c;如&#xff1a;網絡管理&am…

腳本運行禁止:npm 無法加載文件,因為在此系統上禁止運行腳本

問題與處理策略 1、問題描述 npm install -D tailwindcss執行上述指令&#xff0c;報如下錯誤 npm : 無法加載文件 D:\nodejs\npm.ps1&#xff0c;因為在此系統上禁止運行腳本。 有關詳細信息&#xff0c;請參閱 https:/go.microsoft.com/fwlink/?LinkID135170 中的 about_…

Java基礎——分層解耦——IOC和DI入門

目錄 三層架構 Controller Service Dao ?編輯 調用過程 面向接口編程 分層解耦 耦合 內聚 軟件設計原則 控制反轉 依賴注入 Bean對象 如何將類產生的對象交給IOC容器管理&#xff1f; 容器怎樣才能提供依賴的bean對象呢&#xff1f; 三層架構 Controller 控制…

智慧園區系統集成解決方案引領未來城市管理的智能化轉型

內容概要 在現代城市管理的背景下&#xff0c;“智慧園區系統集成解決方案”正扮演著越來越重要的角色。這種解決方案不僅僅是技術上的創新&#xff0c;更是一種全新的管理理念&#xff0c;它旨在通過高效的數據整合與分析&#xff0c;優化資源配置&#xff0c;提升運營效率。…

99.24 金融難點通俗解釋:MLF(中期借貸便利)vs LPR(貸款市場報價利率)

目錄 0. 承前1. 什么是MLF&#xff1f;1.1 專業解釋1.2 通俗解釋1.3 MLF的三個關鍵點&#xff1a; 2. 什么是LPR&#xff1f;2.1 專業解釋2.2 通俗解釋2.3 LPR的三個關鍵點&#xff1a; 3. MLF和LPR的關系4. 傳導機制4.1 第一步&#xff1a;央行調整MLF4.2 第二步&#xff1a;銀…

【VM】VirtualBox安裝CentOS8虛擬機

閱讀本文前&#xff0c;請先根據 VirtualBox軟件安裝教程 安裝VirtualBox虛擬機軟件。 1. 下載centos8系統iso鏡像 可以去兩個地方下載&#xff0c;推薦跟隨本文的操作用阿里云的鏡像 centos官網&#xff1a;https://www.centos.org/download/阿里云鏡像&#xff1a;http://…

Elasticsearch中的度量聚合:深度解析與實戰應用

在大數據和實時分析日益重要的今天&#xff0c;Elasticsearch以其強大的搜索和聚合能力&#xff0c;成為了眾多企業和開發者進行數據分析和處理的首選工具。本文將深入探討Elasticsearch中的度量聚合&#xff08;Metric Aggregations&#xff09;&#xff0c;展示其如何在數據分…

C_C++輸入輸出(下)

C_C輸入輸出&#xff08;下&#xff09; 用兩次循環的問題&#xff1a; 1.一次循環決定打印幾行&#xff0c;一次循環決定打印幾項 cin是>> cout是<< 字典序是根據字符在字母表中的順序來比較和排列字符串的&#xff08;字典序的大小就是字符串的大小&#xff09;…