數據結構系列二:包裝類+泛型

包裝類+泛型

  • 一、包裝類
    • (1)基本數據類型和對應的包裝類
    • (2)裝箱和拆箱
  • 二、泛型
    • (1)什么是泛型
    • (2)引出泛型
    • (3)語法
    • (4)泛型類的使用
      • 1.語法
      • 2.示例
      • 3.類型推導
    • (5)裸類型
    • (6)泛型是如何編譯的
      • 1.擦除機制
      • 2.為什么不能實例化泛型類數組?
    • (7)泛型的上界
      • 1.語法
      • 2.示例
      • 3.復雜示例
    • (8)泛型方法
      • 1.語法
      • 2.示例


一、包裝類

在Java中,由于基本類型不是繼承自Object,為了在泛型代碼中可以支持基本類型,Java給每個基本類型都對應了一個包裝類型

(1)基本數據類型和對應的包裝類

基本數據類型包裝類
byteByte
shortShort
intInteger
longLong
floatFloat
doubleDouble
charCharacter
booleanBoolean
  • 除了Integercharacter,其余基本類型的包裝類都是首字母大寫

(2)裝箱和拆箱

  • 裝箱:把一個基本數據類型轉化為包裝類型的過程
  • 拆箱:將一個包裝類中的值取出,放到一個基本類型中

自動裝箱與自動拆箱

public class demo {public static void main(String[] args) {//自動裝箱int i = 10;Integer a = i;//自動拆箱int b = a;}
}

顯示裝箱和顯示拆箱

        //顯示裝箱int c = 20;Integer d = Integer.valueOf(c);//顯示拆箱:拆箱為自己指定的元素int e = d.intValue();double e1 = d.doubleValue();

二、泛型

(1)什么是泛型

一般的類和方法,只能使用具體的類型,要么是基本類型,要么是自定義的類,如果要編寫可以應用于多種類型的代碼,這種刻板的限制對代碼的束縛就會很大。—— 《Java編程思想》
泛型是在jdk1.5引入的新語法,通俗講,泛型:就是適用于許多許多類型,從代碼上將,就是對類型實現了參數化

(2)引出泛型

實現一個類,類中包含一個數組成員,使得數組中可以存放任何類型的數據,也可以根據成員方法返回數組中某個下標的值?
思路:

  1. 我們以前學過的數組,只能存放指定類型的數據,例如String[]int[]
  2. 所有類的父類,默認為Object類,數組是否可以創建為Object
class MyArray{Object[] array = new Object[10];public void set(int pos,Object val){this.array[pos] = val;}public Object get(int pos){return this.array[pos];}
}
public class demo1 {public static void main(String[] args) {MyArray myArray = new MyArray();myArray.set(0,10000);myArray.set(1,"hello");String ret = myArray.get(1);//編譯報錯String ret = (String) myArray.get(1);}
}

以上代碼實現后發現

  1. 任何類型數據都可以存放
  2. 1號下標本身就是字符串,但是卻編譯報錯,必須進行強制類型轉換才可以

雖然在這種情況下,當前數組任何數據都可以存放,但是,更多情況下,我們還是希望他只能夠持有一種數據類型,而不是同時持有這么多類型,所以,泛型的主要目的:指定當前的容器,要持有什么類型的對象,讓編譯器去做檢查,此時,就需要把類型作為參數傳遞,需要什么類型,就傳入什么類型

(3)語法

class 泛型類名稱<類型形參列表>{//這里可以使用類型參數
}
class ClassName<T1,T2……Tn>{}
class 泛型類名稱<類型形參列表> extends 繼承類{//這里可以使用類型參數
}
class ClassName<T1,T2……Tn> extends ParentClass<T1>{//可以只使用部分類型參數
}

上述代碼進行改寫如下

class Myarray<T>{Object[] array = new Object[10];public void set(int pos,T val){this.array[pos] = val;}public T get(int pos) {return (T)this.array[pos];}
}
public class demo2 {public static void main(String[] args) {Myarray<String> myArray = new Myarray<>();myArray.set(0,"sadfklsajdfs");myArray.set(1,"qwe");String ret = myArray.get(0);String ret1 = myArray.get(1);System.out.println(ret);System.out.println(ret1);Myarray<Integer> myarray = new Myarray<>();myarray.set(0,3);Integer ret2 = myarray.get(0);System.out.println(ret2);}
}
//輸出結果
sadfklsajdfs
qwe
3Process finished with exit code 0

代碼解釋:

  1. 類名后的代表占位符,表示當前類是一個泛型類

類型形參一般使用一個大寫字母來表示,常用的名稱有

  • E表示Element
  • K表示Key
  • V表示Value
  • N表示Number
  • T表示Type
  1. 不能new泛型類型的數組
T[] ts = new T[5];//是不對的
  1. 類型后需要加入包裝類指定當前類型
Myarray<String> myArray = new Myarray<>();
  1. 存放元素的時候會幫我們檢查,如果和包裝類不同,會報錯提示

(4)泛型類的使用

1.語法

泛型類<類型實參> 變量名 = new 泛型類<類型實參>(構造方法實參);

2.示例

尖括號中只能是引用類型,不能是基本類型

Myarray<String> myArray = new Myarray<String>();

注意:泛型只能接受類,所有的基本數據類型必須使用包裝類

3.類型推導

當編譯器可以根據上下文推導出類型實參時,可以省略類型實參的填寫,但是尖括號不能省略

Myarray<String> myArray = new Myarray<>();

(5)裸類型

裸類型是一個泛型類但是沒有帶著類型實參

Myarray list = new Myarray();

注意:我們不要自己去使用裸類型,裸類型是為了兼容老版本的API保留的機制

(6)泛型是如何編譯的

1.擦除機制

那么,泛型到底是怎么編譯的呢?這個問題也是曾經的一個面試問題,泛型本質是一個非常難的語法,要理解好它還是需要一定的時間打磨
我們先察看字節碼文件,發現所有的T都是Object

  • 在編譯的過程中,將所有的T替換為Object這種機制,我們稱為擦除機制
  • 運行的時候沒有泛型這樣的概念,泛型的擦除機制,只存在于編譯期間

2.為什么不能實例化泛型類數組?

原因:替換后的方法為:將Object[]分給Integer[]引用,程序報錯
不能證明所有類型都是Integer類型
通俗講就是:返回的Object數組里面,可能存放的是任何的數據類型,可能是String,可能是Integer,運行的時候,直接傳給Integer類型的數組,編譯器認為是不安全的

(7)泛型的上界

在定義泛型類時,有時需要對傳入的類型變量做一定的約束,可以通過類型邊界來約束

1.語法

class 泛型類名稱<類型實參 extends 類型邊界>{}

2.示例

class test<E extends Number>{}

extends表示拓展,只接受Number的子類型作為E的類型實參

class test<E extends Number>{}
public class demo4 {public static void main(String[] args) {test<Integer> a1;//正常,因為Integer是Number的子類型test<String> a2;//編譯錯誤,因為String不是Number的子類型}
}

沒有指定類型邊界E,可以視為E extends Object

3.復雜示例

寫一個泛型類,實現一個方法,這個方法是就指定類型泛型的最大值

class Alg<T extends Comparable<T>>{public T findMax(T[] array){T max = array[0];for (int i = 1; i < array.length; i++) {if(array[i].compareTo(max) > 0){max = array[i];}}return max;}
}
public class demo5 {public static void main(String[] args) {Alg<Integer> alg1 = new Alg<>();Integer[] array = {1,2,3,4,5};Integer ret = alg1.findMax(array);System.out.println(ret);}
}
//輸出結果
5Process finished with exit code 0

(8)泛型方法

1.語法

方法限定符<類型形參列表> 返回值類型 方法名稱(形參列表){}

2.示例

class Util{public <T extends Comparable<T>> T findMax(T[] array){T max = array[0];for (int i = 1; i < array.length; i++) {if(array[i].compareTo(max) > 0){max = array[i];}}return max;}
}
public class demo6 {public static void main(String[] args) {Util util = new Util();Integer[] array = {1,2,3,4,5};Integer ret = util.findMax(array);System.out.println(ret);}
}
//輸出結果
5Process finished with exit code 0

靜態方法可以直接通過類名調用

class Util{public static <T extends Comparable<T>> T findMax(T[] array){T max = array[0];for (int i = 1; i < array.length; i++) {if(array[i].compareTo(max) > 0){max = array[i];}}return max;}
}
public class demo6 {public static void main(String[] args) {Integer[] array = {1,2,3,4,5};Integer ret = Util.findMax(array);System.out.println(ret);}
}
//輸出結果
5Process finished with exit code 0

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

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

相關文章

量子計算驅動的金融衍生品定價革命:突破傳統蒙特卡洛模擬的性能邊界

引言&#xff1a;金融計算的算力困局 某國際投行采用128量子位處理器對亞洲期權組合定價時&#xff0c;其量子振幅估計算法在2.7秒內完成傳統GPU集群需要68小時的計算任務。在蒙特卡洛路徑模擬實驗中&#xff0c;量子隨機游走算法將10,000維衍生品的價格收斂速度提升4個數量級…

Spring容器初始化擴展點:ApplicationContextInitializer

目錄 一、什么是ApplicationContextInitializer&#xff1f; 1、核心作用2、適用場景 二、ApplicationContextInitializer的使用方式 1、實現ApplicationContextInitializer接口2、注冊初始化器 三、ApplicationContextInitializer的執行時機四、實際應用案例 1、動態設置環境…

hive—常用的函數整理

1、size(split(...))函數用于計算分割后字符串數組的長度 實例1&#xff09;&#xff1a;由客戶編號列表計算客戶編號個數 --數據準備 with tmp_test01 as ( select tag074445270 tag_id,202501busi_mon , 012399931003,012399931000 index_val union all select tag07444527…

vue3 采用xlsx庫實現本地上傳excel文件,前端解析為Json數據

需求&#xff1a;本地上傳excel 文件&#xff0c;但需要對excel 文件的內容進行解析&#xff0c;然后展示出來 1. 安裝依賴 首先&#xff0c;確保安裝了 xlsx 庫&#xff1a; bash復制 npm install xlsx 2. 創建 Vue 組件 創建一個 Vue 組件&#xff08;如 ExcelUpload.v…

若依框架實現動態失效時間JWT Token的實踐指南

一、功能需求背景 在前后端分離架構中&#xff0c;JWT&#xff08;JSON Web Token&#xff09;作為無狀態認證方案被廣泛使用。若依&#xff08;RuoYi&#xff09;框架的TokenService默認采用固定失效時間策略&#xff0c;但在實際開發中常需要根據業務場景動態調整Token有效期…

C++ 設計模式-策略模式

支付策略 #include <iostream> #include <memory> #include <unordered_map> #include <vector> #include <ctime>// 基礎策略接口 class PaymentStrategy { public:virtual ~PaymentStrategy() default;virtual std::string name() const 0;…

國產編輯器EverEdit - 如何在EverEdit中管理工程?

1 工程管理 1.1 應用場景 用戶創建工程后&#xff0c;會涉及到工程的管理 &#xff0c;比如&#xff1a;打開工程、關閉工程等 1.2 使用方法 1.2.1 打開工程 單擊主菜單工程 -> 打開工程&#xff0c;會彈出打開對話框&#xff0c;用戶在對話框中選擇需要打開的工程文件即…

MYSQL-數據庫-DDL-DML-DQL-DCL-基礎學習

MySql概念&#xff1a; 建立在關系模型基礎上&#xff0c;有多張相互連接的二維表組成的數據庫 SQL通用語法&#xff1a; 1.SQL語句可以單行或多行書寫&#xff0c;以分號結尾 2.SQL語句可以使用空格/縮進來增強語句的可讀性 3.MySQL數據庫的SQL語句不區分大小寫&#xff0c;關…

SpringBoot核心框架之AOP詳解

SpringBoot核心框架之AOP詳解 一、AOP基礎 1.1 AOP概述 AOP&#xff1a;Aspect Oriented Programming&#xff08;面向切面編程&#xff0c;面向方面編程&#xff09;&#xff0c;其實就是面向特定方法編程。 場景&#xff1a;項目部分功能運行較慢&#xff0c;定位執行耗時…

【RK3588嵌入式圖形編程】-SDL2-構建模塊化UI

構建模塊化UI 文章目錄 構建模塊化UI1、概述2、創建UI管理器3、嵌套組件4、繼承5、多態子組件6、總結在本文中,將介紹如何使用C++和SDL創建一個靈活且可擴展的UI系統,重點關注組件層次結構和多態性。 1、概述 在前面的文章中,我們介紹了應用程序循環和事件循環,這為我們的…

第四屆圖像、信號處理與模式識別國際學術會議(ISPP 2025)

重要信息 會議官網&#xff1a;www.icispp.com 會議時間&#xff1a;2025年3月28-30日 會議地點&#xff1a;南京 簡介 由河海大學和江蘇大學聯合主辦的第四屆圖像、信號處理與模式識別國際學術會議&#xff08;ISPP 2025) 將于2025年3月28日-30日在中國南京舉行。會議主…

低代碼與開發框架的一些整合[2]

1.分析的項目資源說明 經過近期的的不斷分析與運行對比&#xff0c;最終把注意力集中在了以下幾個框架&#xff1a; 01.dibootdiboot.diboot: 寫的更少, 性能更好 -> 為開發人員打造的低代碼開發平臺。Mybatis-plus關聯查詢&#xff0c;關聯無SQL&#xff0c;性能高10倍&a…

Spring Boot 中事務的用法詳解

引言 在 Spring Boot 中&#xff0c;事務管理是一個非常重要的功能&#xff0c;尤其是在涉及數據庫操作的業務場景中。Spring 提供了強大的事務管理支持&#xff0c;能夠幫助我們簡化事務的管理和控制。本文將詳細介紹 Spring Boot 中事務的用法&#xff0c;包括事務的基本概…

Java面試——Tomcat

優質博文&#xff1a;IT_BLOG_CN 一、Tomcat 頂層架構 Tomcat中最頂層的容器是Server&#xff0c;代表著整個服務器&#xff0c;從上圖中可以看出&#xff0c;一個Server可以包含至少一個Service&#xff0c;用于具體提供服務。Service主要包含兩個部分&#xff1a;Connector和…

第4章 信息系統架構(三)

4.3 應用架構 應用架構的主要內容是規劃出目標應用分層分域架構&#xff0c;根據業務架構規劃目標應用域、應用組和目標應用組件&#xff0c;形成目標應用架構邏輯視圖和系統視圖。從功能視角出發&#xff0c;闡述應用組件各自及應用架構整體上&#xff0c;如何實現組織的高階…

python小項目編程-中級(1、圖像處理)

目錄 圖像處理 實現 測試 unittest pytest 圖像處理 實現界面化操作&#xff0c;使用PIL庫實現簡單的圖像處理功能&#xff0c;如縮放&#xff08;設置縮放比例&#xff09;、旋轉和濾鏡、對比度調整、亮度調整、灰度圖、二值化圖&#xff08;二值圖如果使用的是彩色圖片需…

【Leetcode 每日一題】2209. 用地毯覆蓋后的最少白色磚塊

問題背景 給你一個下標從 0 0 0 開始的 二進制 字符串 f l o o r floor floor&#xff0c;它表示地板上磚塊的顏色。 f l o o r [ i ] floor[i] floor[i] 為 ‘0’ 表示地板上第 i i i 塊磚塊的顏色是 黑色 。 f l o o r [ i ] floor[i] floor[i] 為’1’ 表示地板上第 i …

Docker 性能優化指南

Docker 提供了強大的容器化功能&#xff0c;能夠幫助開發者在不同的環境中構建、測試和部署應用。然而&#xff0c;隨著容器化應用的不斷增長&#xff0c;Docker 容器可能會面臨一些性能瓶頸&#xff0c;影響其運行效率、資源占用和擴展能力。為了確保容器在生產環境中的高效運…

2025 WE DAY品牌日| 天璇II WE X7 Pro充電樁震撼發布,能效電氣開啟充電革命

隨著新能源產業的迅猛發展,充電樁作為電動汽車能量補給的重要基礎設施,正在成為市場關注的焦點。能效電氣作為充電樁領域的佼佼者,專注于研發高效、智能的充電解決方案,為電動汽車的普及與可持續發展鋪設了堅實的基礎。 2025年2月21日,能效電氣在深圳盛大舉辦了以“以創新 引未…

< OS 有關 > Ubuntu 24 SSH 服務器更換端口 in jp/us VPSs

原因&#xff1a; 兩臺 VPS 的 ssh 端口一直被密碼重試&#xff0c; us 這臺已經封了 632, jp 這臺兩周前清過一次 sqlite3 數據&#xff0c;現在贊到 1008 Fail2Ban 是使用 sqlite3 來記錄&#xff0c;數據量大后&#xff0c;硬盤的 I/O 會飆升&#xff0c;我有寫過一個 app…