java數據結構集合復習之包裝類和泛型

前言: 這是我最一年學習java的一部分的回顧總結

1.包裝類

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

1.1基本數據類型和對應的包裝類

----
基本數據類型包裝類
byteByte
shortShort
intInteger
longLong
floatFloat
doubleDouble
charCharacter
booleanBoolean

除了 Integer 和 Character, 其余基本類型的包裝類都是首字母大寫。

1.2 裝箱和拆箱

int i = 10;
// 裝箱操作,新建一個 Integer 類型對象,將 i 的值放入對象的某個屬性中
Integer ii = Integer.valueOf(i);
Integer ij = new Integer(i);
// 拆箱操作,將 Integer 對象中的值取出,放到一個基本數據類型中
int j = ii.intValue();

裝箱(Boxing):是將基本數據類型轉換為對應的包裝類對象的過程。
拆箱(Unboxing):則是將包裝類對象轉換為對應的基本數據類型的過程。

注意: 裝箱和拆箱在 Java 中自動進行,這為開發者提供了便利,但也需要注意一些性能和空指針異常的問題。例如,如果一個包裝類對象為 null ,在進行拆箱操作時就會拋出空指針異常。

1.3 自動裝箱和自動拆箱

從上面裝箱拆箱使用過程中,可以發現有不少的代碼量,為了減少開發者的負擔,java提供的自動機制

int i = 10;
Integer ii = i; // 自動裝箱
Integer ij = (Integer)i; // 自動裝箱
int j = ii; // 自動拆箱
int k = (int)ii; // 自動拆箱

思考:
下面代碼輸出的是什么,為什么?

public static void main(String[] args) {
Integer a = 127;
Integer b = 127;
Integer c = 128;
Integer d = 128;
System.out.println(a == b);
System.out.println(c == d);
}

我們先看結果
a == b是true
c == d是false
在這里插入圖片描述
進入debug可以發現
a和b對象的地址是一樣的
c和d對象的地址是不一樣的
在這里插入圖片描述
原因:
在 Java 中,對于值在 -128127 之間的 Integer 對象,會進行緩存。當使用 Integer.valueOf() 方法創建對象時,如果值在這個范圍內,會直接從緩存中獲取已有的對象,所以 ab 指向的是同一個對象,a == b 結果為 true

而對于值不在 -128127 之間的 Integer 對象,每次使用 Integer.valueOf() 方法創建都會生成新的對象。所以 cd 是兩個不同的對象,c == d 結果為 false

2.泛型

2.1什么是泛型?

一般的類和方法,只能使用具體的類型:
要么是基本類型,要么是自定義的類。如果要編寫可以應用于多種類型的代碼,這種刻板的限制對代碼的束縛就會很大。-----來源《Java編程思想》對泛型的介紹。

在 Java 中,泛型是一種參數化類型的機制。
泛型使得可以在定義類、接口和方法時使用類型參數,從而增強了代碼的類型安全性和可讀性,并減少了類型轉換的需求。
增強類型安全:通過指定泛型類型,編譯器可以在編譯階段就檢查類型的正確性。例如,如果定義了一個泛型集合 List< String > ,那么就不能向其中添加非 String 類型的元素,否則會在編譯時出錯。
提高代碼的可讀性:使得代碼的意圖更加清晰。當看到一個泛型類或方法的定義時,能很容易明白其處理的數據類型。
減少類型轉換:使用泛型可以避免繁瑣的類型轉換。
例如,定義一個泛型類 Box

通俗來講,泛型:就是適用于許多許多類型。從代碼上講,就是對類型實現了參數化。

2.2引出泛型

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

思路:

  1. 我們以前學過的數組,只能存放指定類型的元素
    例如:
int[] array = new int[10]; 
String[] strs = new String[10];
  1. 所有類的父類,默認為Object類。數組是否可以創建為Object?
    例如:
class  MyArray{public Object[] array = new Object[10];public Object getPos(int pos){return this.array[pos];}public void setVal(int pos,Object val){this.array[pos] = val;}}
public class TestDemo {public static void main(String[] args) {MyArray myArray = new MyArray();myArray.setVal(0,10);myArray.setVal(1,"hello");//字符串也可以存放String ret = myArray.getPos(1);//編譯報錯System.out.println(ret);}
}

問題:以上代碼實現后 發現

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

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

2.3泛型類的語法

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

上述代碼進行改寫如下:

class  MyArray<T>{public T[]array =(T[]) new Object[10];public T getPos(int pos){return this.array[pos];}public void setVal(int pos,T val){this.array[pos] = val;}}public static void main(String[] args) {MyArray<String> myArray = new MyArray();String ret = myArray.getPos(1);myArray.setVal(2,"byte");myArray.setVal(1,1);}

代碼解釋:

  1. 類名后的 代表占位符,表示當前類是一個泛型類
    了解: 【規范】類型形參一般使用一個大寫字母表示,常用的名稱有:
    E 表示 Element
    K 表示 Key
    V 表示 Value
    N 表示 Number
    T 表示 Type
    S, U, V 等等 - 第二、第三、第四個類型

  2. 不能new泛型類型的數組
    例如:

T[] ts = new T[5];//是不對的
  1. 類型后加入 < Integer > 指定當前類型
MyArray<String> myArray = new MyArray();
  1. 不需要進行強制轉換
String ret = myArray.getPos(1);
  1. 代碼編譯報錯,編譯器會在存放元素的時
    候幫助我們進行類型檢查。
myArray.setVal(1,1);

2.4泛型類的使用

示例:

MyArray<Integer> list = new MyArray<Integer>();

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

2.5類型推導(Type Inference)

當編譯器可以根據上下文推導出類型實參時,可以省略類型實參的填寫

MyArray<Integer> list = new MyArray<>(); // 可以推導出實例化需要的類型實參為 Integer

總結:

  1. 泛型是將數據類型參數化,進行傳遞
  2. 使用 表示當前類是一個泛型類。
  3. 泛型目前為止的優點:數據類型參數化,編譯時自動進行類型檢查和轉換

2.6泛型的上界

語法

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

示例:

public class MyArray<E extends Number> {
...
}

只接受 Number 的子類型作為 E 的類型實參

MyArray< Integer > l1; // 正常,因為 Integer 是 Number 的子類型
MyArray< String > l2; // 編譯錯誤,因為 String 不是 Number 的子類型

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

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

相關文章

ubuntu軟件源的兩種格式和環境變量

1. ubuntu的/etc是什么目錄&#xff1f; 在Ubuntu操作系統中&#xff0c;/etc/是一個特殊的目錄&#xff0c;它包含系統的配置文件。這些配置文件用于設置各種系統和應用程序的參數和選項。 一般來說&#xff0c;用戶可以在這個目錄下找到各種重要的配置文件&#xff0c;如網絡…

Web3 ETF的主要功能

Web3 ETF的主要功能可以概括為以下幾點&#xff0c;Web3 ETF仍是一項新興投資產品&#xff0c;其長期表現仍存在不確定性。投資者在投資Web3 ETF之前應仔細研究相關風險&#xff0c;并做好充分的風險評估。北京木奇移動技術有限公司&#xff0c;專業的軟件外包開發公司&#xf…

商務辦公優選!AOC Q27E3S2商用顯示器,打造卓越新體驗!

摘要&#xff1a;助辦公室一族縱橫職場&#xff0c;實現高效舒適辦公&#xff01; 在日常商務辦公中&#xff0c;對于辦公室一族來說總有太多“難難難難難點”&#xff1a;工作任務繁瑣&#xff0c;熬夜加班心力交瘁、長時間伏案工作導致頸椎、眼睛等出現問題&#xff0c;職業…

BBA車主,千萬別去試駕問界M9

文 | AUTO芯球 作者 | 雷慢&響鈴 我勸你啊&#xff0c;千萬別去試駕問界M9&#xff0c; 不然啊&#xff0c;可能1個小時50萬就沒了&#xff0c; 不信你看這個“大冤種”&#xff0c; 他曾經發誓打死不買電車&#xff0c; 考慮了三、四年換寶馬X5&#xff0c; 結果談完…

GNU/Linux - 如何編譯kernel

使用 make 命令構建 Linux 內核涉及多個步驟。下面是整個過程的基本概述&#xff1a; 1. 獲取內核源代碼 * 從 kernel.org 或你的發行版軟件倉庫下載內核源代碼。 * 將源代碼解壓縮到一個目錄中。 2. 配置內核 * 切換到內核源代碼目錄。 * 可選擇清理源代碼樹&#xff1a;mak…

前端面試題5(前端常見的加密方式)

前端常見的加密方式 在前端進行數據加密主要是為了保護用戶的隱私和提升數據傳輸的安全性。前端數據加密可以采用多種方法&#xff0c;以下是一些常見的加密技術和方法&#xff1a; 1. HTTPS 雖然不是直接的前端加密技術&#xff0c;但HTTPS是保障前端與后端數據傳輸安全的基…

關于MCU-Cortex M7的存儲結構(flash與SRAM)

MCU并沒有DDR&#xff0c;所以他把代碼存儲在flash上&#xff0c;臨時變量和棧運行在SRAM上。之所以這么做是因為MCU的cpu頻率很低&#xff0c;都是幾十MHZ到一二百MHZ&#xff0c;flash的讀取速度能夠滿足cpu 的取指需求&#xff0c;但flash 的寫入速度很慢&#xff0c;所以引…

剛辦理的手機號被停用,你可能遇到這些問題了!

很多朋友都會遇到手機號被停用的情況&#xff0c;那么你知道你的手機號為什么會被停用嗎&#xff1f;接下來&#xff0c;關于手機號被停用的問題&#xff0c;跟著小編一塊來了解一下吧。 ?停機的兩種形態&#xff1a; 1、第一個是局方停機&#xff0c;即語音、短信和流量都不…

xmind2testcase工具將測試用例從Xmind轉為CSV導入禪道

使用xmind編寫測試用例&#xff0c;使用xmind2testcase工具將測試用例從Xmind轉為CSV導入禪道&#xff0c;便于管理。 1.工具準備 第一步&#xff1a;安裝python 第二步&#xff1a;安裝xmind2testcase工具 運行-cmd-打開命令提示符彈窗&#xff0c;輸入安裝命令 安裝命令&…

意圖數據集HWU、Banking預處理

當談到意圖數據集時&#xff0c;HWU、Banking和Clinc是三個常見的數據集。以下是關于這三個數據集的介紹&#xff1a; 目錄 一、數據集介紹 HWU數據集 Banking數據集 Clinc數據集 二、數據集預處理 數據處理 數據存儲 數據類別分析 句子長度統計 一、數據集介紹 HW…

嵌入式硬件電路常用設計軟件

目錄 1. Cadence Allegro 2. PADS 3. Altium Designer 4. Multisim 5. Protues 1. Cadence Allegro 功能&#xff1a; Cadence Allegro是Cadence公司推出的先進PCB&#xff08;Printed Circuit Board&#xff0c;印刷電路板&#xff09;設計布線工具&#xff0c;也是目前…

華為HCIP Datacom H12-821 卷26

1.單選題 在VRRP中&#xff0c;同一備份組的設備在進行VRRP報文認證時&#xff0c;以下哪一參數不會影響Master設備和Backup設備認證協商結果 A、認證字 B、優先級 C、認證方式 D、VRRP版本 正確答案&#xff1a; B 解析&#xff1a; 優先級只會影響誰是主誰是備&…

AI產品經理能力模型的重點素質:人文素養和靈魂境界

在AI產品經理的能力模型中&#xff0c;我最想提的差異化關鍵點&#xff0c;就是“人文素養和靈魂境界”。 1 為什么“人文素養和靈魂境界”非常重要&#xff1f; 一、“人文素養和靈魂境界”如何影響AI產品設計&#xff1f; 例1&#xff1a;面對一個具體的AI場景&#xff0…

25考研,數二全程跟的張宇老師請問660(做了一半)880和張宇1000題應該怎么選擇?

跟張宇老師&#xff0c;也可以做其他的題集&#xff0c;不一定非要做1000題 我當初考研復習的時候&#xff0c;也聽了張宇老師的課程&#xff0c;但是我并沒有做1000題 因為1000題對于我來說太難了。做了一章之后&#xff0c;就換成其他的題目了。 對于大家來說&#xff0c;…

【機器學習實戰】Baseline精讀筆記

比賽用到的庫 numpy&#xff1a;提供&#xff08;多維&#xff09;數組操作 pandas&#xff1a;提供數據結構、數據分析 catboost&#xff1a;用于機器學習的庫&#xff0c;特別是分類和回歸任務 sklearn.model_selection&#xff1a;包含模型選擇的多種方法&#xff0c;如交…

Android 監聽網絡狀態變化(無切換中間態版)

需求&#xff1a; 獲取當前的網絡狀態與類型&#xff08;WIFI、數據流量&#xff09;監聽網絡狀態真正變化監聽網絡類型發生變化 業務場景&#xff1a; 用戶打開 App 時、使用過程中&#xff0c;出現無網絡時&#xff0c;顯示 Toast 提示。但當 wifi、數據流量 互相切換的過…

ppt接單渠道大公開??

PPT 接單主要分兩種&#xff1a;PPT 模板投稿和PPT 定制接單&#xff0c;我們先從簡單的 PPT 模板投稿說起。 PPT 模板投稿 利用業余時間&#xff0c;做一些 PPT 模板上傳到平臺&#xff0c;只要有人下載你的模板&#xff0c;你就有收入。如果模板質量高&#xff0c;簡直就是一…

【設計模式】觀察者模式(定義 | 特點 | Demo入門講解)

文章目錄 定義結構Demo | 代碼Subject目標類Observer抽象觀察者觀察者1 | CPU監聽器觀察者2 | 內存監聽器客戶端 | Client 優點適合場景 定義 所謂觀察者模式就是你是被觀察的那個對象&#xff0c;你爸爸媽媽就是觀察者&#xff0c;一天24h盯著你&#xff0c;一旦你不聽話&…

【BUUCTF-PWN】7-[第五空間2019 決賽]PWN5

參考&#xff1a;BUU pwn [第五空間2019 決賽]PWN5 //格式化字符串漏洞 - Nemuzuki - 博客園 (cnblogs.com) 格式化字符串漏洞原理詳解_printf 任意內存讀取-CSDN博客 32位小端排序&#xff0c;有棧溢出保護 運行效果&#xff1a; 查看main函數 存在格式化字符串漏洞 輸…

SQL二次注入原理分析

二次注入在測試的時候比較少見&#xff0c;或者說很難被測出來&#xff0c;因為測的時候首先要去找注入的位置&#xff0c;其次是去判斷第一次執行的SQL語句&#xff0c;然后還要去判斷第二次進行調用的 SQL 語句。而關鍵問題就出在第二次的調用上面。 下面以一個常用過濾方法…