數據結構青銅到王者第二話---數據結構基本常識(2)

????????續接上一話

一、包裝類

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

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

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

2、裝箱和拆箱

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

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);}

輸出分別為:

????????????????????????true

????????????????????????false? ?

????????這是因為用到了裝箱,如下就是裝箱的操作:

public static Integer valueOf(int i){if(i >= IntegerCache.low && i <= IntegerCache.high)return IntegerCache.cache[i+(-IntegerCache.low)];return new Integer(i);
}

? ? ? ? 這就可以得到一個初步的結論:i應該是在一個范圍內的時候去數組里面直接拿值,不在這個范圍內的時候,他就會返回因的對象,新對象之間直接用等號比較,結果當然是不一樣的!!!

? ? ? ? 其實,哪怕不看的話,我們也可以猜個八九不離十,因為都是和2的幾次方相關的,經驗多了也就會了!!!

?二、泛型

1、什么是泛型

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

???????? 泛型是在JDK1.5引入的新的語法,通俗講,泛型:就是適用于許多許多類型。從代碼上講,就是對類型實現了參數化。

2、泛型的簡單介紹

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

思路:

(1)我們以前學過的數組,只能存放指定類型的元素,例如:int[] array = new int[10]; String[] strs = new String[10];

(2)所有類的父類,默認為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.1基本語法

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

上述代碼進行改寫如下:

class MyArray<T> {public Object[] array =  new Object[10];public T getPos(int pos) {return (T)this.array[pos];}public void setVal(int pos,T val) {this.array[pos] = val;}}public class TestDemo {public static void main(String[] args) {MyArray<Integer> myArray = new MyArray<>();//1myArray.setVal(0,10);myArray.setVal(1,12);int ret = myArray.getPos(1);//2System.out.println(ret);myArray.setVal(2,"bit");//3}}

代碼解釋:

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

(了解: 【規范】類型形參一般使用一個大寫字母表示,常用的名稱有:

????????????????E 表示 Element

????????????????K 表示 Key

????????????????V 表示 Value

????????????????N 表示 Number

????????????????T 表示 Type

S, U, V 等等 - 第二、第三、第四個類型)

(2)注釋1處,類型后加入指定當前類型

(3)注釋2處,不需要進行強制類型轉換

(4)注釋3處,代碼編譯報錯,此時因為在注釋2處指定類當前的類型,此時在注釋3處,編譯器會在存放元素的時候幫助我們進行類型檢查。

3、泛型的使用

3.1語法

泛型類<類型實參> 變量名;  // 定義一個泛型類引用
new 泛型類<類型實參>(構造方法實參);  // 實例化一個泛型類對象

示例:

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

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

3.2類型推導(Type?Inference)

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

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

4、裸類型(Raw Type) (了解)

4.1說明

????????裸類型是一個泛型類但沒有帶著類型實參,例如 MyArrayList 就是一個裸類型

MyArray list = new MyArray();

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

????????下面的類型擦除部分,我們也會講到編譯器是如何使用裸類型的。

小結:

(1)泛型是將數據類型參數化,進行傳遞

(2)使用 <T> 表示當前類是一個泛型類。

(3)泛型目前為止的優點:數據類型參數化,編譯時自動進行類型檢查和轉換

5、擦除機制

????????在編譯的過程當中,將所有的 T 替換為 Object 這種機制,我們稱為:擦除機制。

????????Java的泛型機制是在編譯級別實現的。編譯器生成的字節碼在運行期間并不包含泛型的類型信息。

????????編譯完成以后,T被擦除為Object(編譯期間用T進行類型的檢查和轉換)

Java泛型擦除機制之答疑解惑 - 知乎https://zhuanlan.zhihu.com/p/51452375

6、泛型的上界

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

6.1語法

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

示例:

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

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

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

(當沒有指定的邊界時,可以認為E extends Object)

復雜示例:

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

(E必須是實現了Comparable接口的)

7、泛型方法

7.1定義語法

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

7.2示例:

 public class Util {//靜態的泛型方法 需要在static后用<>聲明泛型類型參數public static <E> void swap(E[] array, int i, int j) {E t = array[i];array[i] = array[j];array[j] = t;}}

7.3使用示例-可以類型推導

 Integer[] a = { ... };swap(a, 0, 9);String[] b = { ... };swap(b, 0, 9);

7.4使用示例-不使用類型推導

 Integer[] a = { ... };Util.<Integer>swap(a, 0, 9);String[] b = { ... };Util.<String>swap(b, 0, 9);

三、List的介紹

1、什么是List

????????在集合框架中,List是一個接口,繼承自Collection。

????????Collection也是一個接口(繼承自Iterable),該接口中規范了后序容器中常用的一些方法,具體如下所示:

????????Iterable也是一個接口,表示實現該接口的類是可以逐個元素進行遍歷的,具體如下:

List的官方文檔:

?List (Java Platform SE 8 )https://docs.oracle.com/javase/8/docs/api/java/util/List.html????????站在數據結構的角度來看,List就是一個線性表,即n個具有相同類型元素的有限序列,在該序列上可以執行增刪 改查以及變量等操作

2、常見接口介紹

????????List中提供了好的方法,具體如下:

????????雖然方法比較多,但是常用方法如下:

3、List的使用

#注:List是個接口,并不能直接用來實例化。

如果要使用,必須去實例化List的實現類。在集合框架中,ArrayList和LinkedList都實現了List接口。( 具體使用參考下一話!!!)

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

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

相關文章

fastdds qos:DeadlineQosPolicy

1含義DeadlineQosPolicy這種qos使用在DataWriter、DataReader、Topic。該qos用來監督數據是不是按照預期的頻率進行收發。假如數據是周期性發送和接收&#xff0c;周期是固定的100ms&#xff0c;我們如果想要監督數據收發是不是按照預期的周期進行的&#xff0c;那么就可以配置…

QT-窗口類部件

Qt窗口類部件 一、窗口類部件 窗口就是沒有父部件的部件&#xff0c;所以又稱頂級部件。窗口類主要包括基本窗口類QWidget、對話框類QDialog和主窗口類QMainWindow三種。QObject是Qt框架中的一個核心基類&#xff0c;它提供了對象模型和信號槽機制。而QPaintDevice及其子類則提…

【CSP初賽】程序閱讀3

文章目錄前置知識閱讀程序判斷選擇答案解析判斷選擇總結前置知識 埃氏篩素數、C 基礎。 閱讀程序 #include <bits/stdc.h> using namespace std; int main(){int a1[51] {0};int i,j,t,t2,n 50;for(i 2;i<sqrt(n);i){if(a1[i] 0){t2 n/i;for(j 2;j<t2;j) …

【ESP32-IDF】高級外設開發4:SPI

系列文章目錄 持續更新中… 文章目錄系列文章目錄前言一、SPI概述1.主要功能2.SPI控制器架構3.SPI通信模式4.SPI數據幀與事務5.DMA與傳輸性能6.中斷與驅動事件二、SPI類型定義及相關API三、SPI示例程序總結前言 在嵌入式開發中&#xff0c;SPI&#xff08;串行外設接口&#…

遙感機器學習入門實戰教程|Sklearn案例⑧:評估指標(metrics)全解析

很多同學問&#xff1a;“模型好不好&#xff0c;怎么量化&#xff1f;” 本篇系統梳理 sklearn.metrics 中常用且“夠用”的多分類指標&#xff0c;并給出一段可直接運行的示例代碼&#xff0c;覆蓋&#xff1a;準確率、宏/微/加權 F1、Kappa、MCC、混淆矩陣&#xff08;計數/…

【Bluedroid】深入解析A2DP SBC編碼器初始化(a2dp_sbc_encoder_init)

SBC(Subband Coding)作為藍牙 A2DP 協議的標準編解碼器,其編碼器的初始化與參數配置直接影響音頻傳輸的音質、效率與兼容性。本文基于Andoird A2DP 協議棧源碼,系統剖析 SBC 編碼器的初始化流程,包括核心參數(比特池、采樣率、聲道模式等)的解析、計算與動態調整邏輯,以…

linux shell測試函數

在 C 語言中&#xff0c;int main(int argc, char *argv[])是程序的入口函數&#xff0c;而??在 main函數中調用專門的測試邏輯&#xff08;如測試函數&#xff09;??的程序結構&#xff0c;通常被稱為??測試程序&#xff08;Test Program&#xff09;??或??測試驅動…

【Java SE】抽象類、接口與Object類

文章目錄一、 抽象類&#xff08;Abstract Class&#xff09;1.1 什么是抽象類&#xff1f;1.2 抽象類的語法1.2.1 定義抽象類1.2.2 繼承抽象類1.3 抽象類的特性1.3.1 不能直接實例化1.3.2 抽象方法的限制1.3.3 抽象類可以包含構造方法1.3.4 抽象類不一定包含抽象方法1.3.5 抽象…

Autodl 創建新虛擬環境 python3.9

問題&#xff1a;本人在autodl上保存的環境因為很長時間沒有開機&#xff0c;autodl竟然給我刪除了。后來看了官網的介紹我才發現&#xff0c;原來15天不開機&#xff0c;autodl就會自動釋放實例。 因此&#xff0c;我就自己重新選了一個虛擬環境&#xff0c;從頭開始配置。 GP…

應急響應靶機-WindowsServer2022挖礦事件

依舊手癢開局&#xff0c;知攻善防實驗室的原創靶機 https://mp.weixin.qq.com/s/URrNHvQSnFKOyefHKXKjQQ 相關賬戶密碼&#xff1a; Administrator/zgsf123 注意&#xff1a;做個原始快照&#xff08;方便日后復習&#xff09;&#xff0c;安裝VMware tool&#xff08;安裝后圖…

PCB電路設計學習3 電路原理圖設計 元件PCB封裝設計與添加

目錄PCB電路設計學習3五、電路原理圖設計5.1 32個發光二極管電路5.2 單片機外圍電路5.3 供電與程序下載電路5.4 連接各部分網絡&#xff0c;繪制邊框和說明六、元件PCB封裝設計與添加6.1 名詞解釋6.2 繪制PCB附學習參考網址歡迎大家有問題評論交流 (* ^ ω ^)PCB電路設計學習3 …

redis---常用數據類型及內部編碼

Redis 中每種常用數據類型都對應多種內部編碼&#xff0c;這些編碼會根據數據特征&#xff08;如大小、數量&#xff09;自動切換&#xff0c;以平衡存儲效率和操作性能。1.字符串&#xff08;String&#xff09;用途&#xff1a;存儲文本、數字或二進制數據&#xff0c;是最基…

crypto.randomUUID is not a function

在本地運行時 crypto.randomUUID 好使&#xff0c;build 后放到服務器上用域名訪問就不好使。原因&#xff1a;瀏覽器策略&#xff0c;瀏覽器在非https、localhost的環境中訪問時&#xff0c;crypto.randomUUID 是不可用的開發時使用的是localhost正常訪問 生產臨時使用的是htt…

【思考】什么是服務器?什么是服務?什么是部署?

文章目錄1 什么是服務器&#xff1f;什么是服務&#xff1f;端口是什么意思&#xff1f;2 什么是部署&#xff1f;1 什么是服務器&#xff1f;什么是服務&#xff1f;端口是什么意思&#xff1f; 服務器本質是一臺運行著程序的電腦&#xff0c;它可以運行著很多程序&#xff0c…

自動駕駛導航信號使用方式調研

1 總結 本文調研在給定導航信號后&#xff0c;如何在端到端架構下&#xff0c;利用導航信息引導軌跡生成。 目前主流的方案可以分為2種。一種是將導航作為“前置引導”深度融入軌跡生成過程&#xff08;導航前置型&#xff09;&#xff1b;另一種則是將導航作為“后置評價”標準…

玳瑁的嵌入式日記D21-08020(數據結構)

雙向鏈表double link listtypedef struct dou_node { DATATYPE data; struct dou_node *prev; struct dou_node *next; }DouLinkNode;雙向鏈表&#xff1a;節點 數據 NEXT PREV . 手撕代碼(增加刪除) 增加&#xff0c;刪除的操作&#xff0c; 需要 tmp 停止待操作節點的前一…

Uipath查找元素 查找子元素 獲取屬性活動組合使用示例

Uipath 查找元素 查找子元素 獲取屬性組合使用示例使用場景案例介紹項目流程圖附加瀏覽器查找元素查找子元素遍歷循環獲取屬性點擊元素使用場景 在實際場景中&#xff0c;有時需RPA自動點擊某組范圍元素或獲取某組范圍元素的值&#xff0c;如需獲取指定的父元素&#xff0c;再…

【MongoDB與MySQL對比】

MongoDB 與 MySQL 全方位對比分析在現代軟件開發中&#xff0c;數據庫的選擇直接影響系統性能、擴展性和開發效率。MongoDB 和 MySQL 作為兩種主流數據庫&#xff0c;分別代表了 NoSQL 和關系型數據庫的典型&#xff0c;各自在不同場景中發揮著重要作用。本文將拋開代碼示例&am…

Spring AI開發指導-對話模型

對話模型接口描述Spring AI基于Spring Cloud的架構體系&#xff0c;定義了一系列可擴展的API接口&#xff0c;支持對接不同類型的AI大模型的核心功能&#xff0c;這些API接口支持同步編程模式或者異步編程模式&#xff1a;接口ModelModel是同步編程模式接口&#xff0c;其參數支…

Win11 下卸載 Oracle11g

目錄 1、停止服務 2、啟動 Universal install 應用 3、執行 deinstall.bat 腳本 4、刪除注冊表相關數據 5、刪除環境變量中的oracle相關路徑 6、刪除安裝文件 7、刪除C盤中的相關Oracle文件 8、刪除 Oracle 數據存放目錄 9、檢查 10、重裝oracle可能還會碰到的問題 &…