在網(wǎng)站怎么做收款二維碼短信營銷
?🎉歡迎大家收看,請(qǐng)多多支持🌹
🥰關(guān)注小哇,和我一起成長🚀個(gè)人主頁🚀
?在更專欄Java ?數(shù)據(jù)結(jié)構(gòu)
?已更專欄有C語言、計(jì)算機(jī)網(wǎng)絡(luò)?
👑目錄
包裝類🌙
?基本類型對(duì)應(yīng)的包裝類
?裝箱與拆箱
🌈自動(dòng)裝箱和顯式裝箱
🚀自動(dòng)裝箱:
🚀顯式裝箱
🚀?Integer類的緩存機(jī)制:
🌈自動(dòng)拆箱和顯式拆箱
🚀自動(dòng)拆箱
🚀顯式拆箱
?🌈相關(guān)面試題及知識(shí)點(diǎn)
泛型🌙
?語法
🌈基本泛型類定義:
🌈多類型參數(shù)的泛型類:
🌈泛型類繼承自其它泛型類:
🌈泛型類繼承自特定類型的泛型類:
?🌈具體代碼舉例:
?泛型類的使用:
🌈語法:
🌈舉例:
?裸類型(了解):
?泛型的擦除機(jī)制(泛型如何編譯):
?泛型的上界
🌈語法:
🌈例子:
🌈復(fù)雜例子:
?泛型方法:
🌈方法示例:
🌈?使用方法示例:
🚀可以類型推導(dǎo):
🚀不使用類型推導(dǎo):
包裝類🌙
Java中每個(gè)基本數(shù)據(jù)類型都對(duì)應(yīng)了一個(gè)包裝類,
除了int的包裝類是Integer,char的包裝類是Character,其他的基本類型對(duì)應(yīng)的包裝類都是將首字母大寫。
基本數(shù)據(jù)類型 | 包裝類 |
byte | Byte |
short | Short |
int | Integer |
long | Long |
char | Character |
boolean | Boolean |
float | Float |
double | Double |
Java中的泛型中,不能直接使用基本數(shù)據(jù)類型作為類型參數(shù);
如果需要使用與基本數(shù)據(jù)類型相關(guān)的泛型,應(yīng)該使用它們對(duì)應(yīng)的包裝類。
?裝箱與拆箱
又叫裝包或拆包。
🌈自動(dòng)裝箱和顯式裝箱
🚀自動(dòng)裝箱:
自動(dòng)地將基本數(shù)據(jù)類型(如int、double等)轉(zhuǎn)換為它們對(duì)應(yīng)的包裝類(如Integer、Double等)
int a = 6;//自動(dòng)裝箱Integer b = a;Integer b2 = (Integer)a;
🚀顯式裝箱
int a = 6;//顯式裝箱,調(diào)用valueOf()方法Integer d = Integer.valueOf(888);Integer d2 = Integer.valueOf(a);Integer d3 = new Integer(a);//已棄用,避免使用
🚀?Integer類的緩存機(jī)制:
這個(gè)緩存機(jī)制默認(rèn)緩存 -128~127的所以Integer對(duì)象。
當(dāng)你創(chuàng)建Integer類型的對(duì)象時(shí),(使用.valueOf或自動(dòng)裝箱來創(chuàng)建對(duì)象,)
如果值在這個(gè)范圍內(nèi),Java會(huì)直接從內(nèi)存中返回已經(jīng)存在的對(duì)象,而不是創(chuàng)建新對(duì)象。
因此在這個(gè)范圍內(nèi)的Integer變量可能指向同一個(gè)對(duì)象示例。
為什么是可能?
如果使用顯式裝箱new Integer(int value)來創(chuàng)建,那么即使值在 -128~127這個(gè)范圍內(nèi),也不會(huì)從內(nèi)存中調(diào)用已經(jīng)存在的對(duì)象,而是創(chuàng)建一個(gè)新的對(duì)象示例。
🌈自動(dòng)拆箱和顯式拆箱
🚀自動(dòng)拆箱
Integer a = 99;//自動(dòng)拆箱int b = a;int b2 = (int)a;
🚀顯式拆箱
Integer a = 99;//顯式拆箱int c = a.intValue();double d = a.doubleValue();
?🌈相關(guān)面試題及知識(shí)點(diǎn)
下面代碼輸出內(nèi)容是什么?
public static void main(String[] args) {Integer aa = 128;Integer bb = 128;System.out.println(aa == bb);Integer a = 127;Integer b = 127;System.out.println(a == b);}
答案是false和true?
為什么呢?
這涉及兩個(gè)知識(shí)點(diǎn):Integer的緩存機(jī)制、引用類型的比較方式。
這里用自動(dòng)裝箱將int類型值轉(zhuǎn)換為Integer對(duì)象,其中a和b為127,在 -128~127這個(gè)范圍內(nèi),因此a和b都指向內(nèi)存中返回的同一個(gè)對(duì)象。
而aa、bb值不在范圍內(nèi),因此aa、bb各自創(chuàng)建一個(gè)新的對(duì)象。
另外,代碼中是用 == 來比較的,在引用類型中,==比較的是實(shí)例對(duì)象的地址,.equals()比較的是對(duì)象的內(nèi)容,.compareTo()比較的是內(nèi)容大小。
a和b指向同一個(gè)對(duì)象,因此 a==b結(jié)果為true;
aa和bb指向的不是同一個(gè)對(duì)象,因此 aa==bb結(jié)果為false。
泛型🌙
通俗講,泛型就是適用于許多類型。
從代碼角度上看,泛型就是將類型參數(shù)化。編譯時(shí)自動(dòng)進(jìn)行類型檢查和轉(zhuǎn)換
泛型的主要目的:
就是指定當(dāng)前的容器,要持有什么類型的對(duì)象。讓編譯器去做檢查。此時(shí),就需要把類型,作為參數(shù)傳遞。需要什么類型,就傳入什么類型。
?語法
🌈基本泛型類定義:
class 泛型類名稱<類型形參列表> { // 這里可以使用類型參數(shù)
}
這里的泛型類名稱是類的名稱就,<類型形參列表>是定義在尖括號(hào)中的類型參數(shù)列表,它們是占位符,用于在類的定義中指定不確定的類型。
例如
class Box<T> { private T t; public void set(T t) {this.t = t; } public T get() {return t; }
}
🌈多類型參數(shù)的泛型類:
class ClassName<T1, T2, ..., Tn> {
}
該類可以擁有多個(gè)類型參數(shù)。類型參數(shù)之間用逗號(hào)分隔。這樣的類可以更加靈活,因?yàn)樗梢酝瑫r(shí)處理多種類型的數(shù)據(jù)。
例如:
class Pair<K, V> { private K key; private V value; public void setKey(K key) {this.key = key; } public void setValue(V value) { this.value = value; } public K getKey() { return key;} public V getValue() { return value;}
}
🌈泛型類繼承自其它泛型類:
class 泛型類名稱<類型形參列表> extends 繼承類<這里可以使用類型參數(shù)> { // 這里可以使用類型參數(shù)
}
當(dāng)泛型類繼承自另一個(gè)泛型類時(shí),子類可以定義自己的類型參數(shù)列表,并且可以在繼承時(shí)使用父類的類型參數(shù)。子類可以選擇性地覆蓋或保留父類的類型參數(shù)。
例如:
class GenericList<E> { // 假設(shè)這里有一些與E類型相關(guān)的操作
} class MyList<T> extends GenericList<T> { // 這里可以直接使用T,因?yàn)門被傳遞給了GenericList
}
🌈泛型類繼承自特定類型的泛型類:
class ClassName<T1, T2, ..., Tn> extends ParentClass<T1> { // 可以只使用部分類型參數(shù)
}
?🌈具體代碼舉例:
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,"Java");//3,此處報(bào)錯(cuò)}}
注釋1處,類型后加入<Integer>指定當(dāng)前類型。
注釋2處不用再進(jìn)行強(qiáng)制類型轉(zhuǎn)換,因?yàn)樵趃etpos()中返回值前就轉(zhuǎn)換了。
注釋3處報(bào)錯(cuò),"Java"是String類型,但myArray已經(jīng)指定了Integer類型,編譯報(bào)錯(cuò)。編譯器會(huì)在我們存放元素時(shí)進(jìn)行類型檢查。
類名后的<T>代表占位符,表示當(dāng)前類是一個(gè)泛型類,< >中必須是引用類型,不能是基本數(shù)據(jù)類型。
類型形參一般用一個(gè)大寫字母表示,常見的有:
T代表Type? ? ? ????????? E代表Element? ? ? ? ????????K代表Key? ? ? ? ????????V代表Value????????
N代表Number? ? ? ? ? ?S、U、V……第二、第三、第四個(gè)類型
?泛型類的使用:
🌈語法:
泛型類<類型參數(shù)> 變量名字;? ?//定義一個(gè)泛型類引用
new 泛型類<類型實(shí)參> (構(gòu)造方法實(shí)參);? ? //實(shí)例化一個(gè)泛型類對(duì)象
🌈舉例:
MyArray<Integer> arr = new MyArray<Integer>();
當(dāng)編譯器可根據(jù)上下文推導(dǎo)處類型參數(shù)的時(shí)候,可以省略< >中的類型參數(shù)
MyArray<Integer> arr = new MyArray<>();?
?裸類型(了解):
是一個(gè)泛型類,但是沒有類型實(shí)參:
MyArray arr = new MyArray();
我們不需要自己去使用裸類型,它是為了兼容老版本的API保留的機(jī)制。?
?泛型的擦除機(jī)制(泛型如何編譯):
在編譯過程中將所有的T替換為Object,這種機(jī)制就是擦除機(jī)制。
當(dāng)泛型類被類型擦除時(shí),如果泛型類中的類型參數(shù)部分指定上限(如<T extends String>),則類型參數(shù)會(huì)被替換成類型上限。
Java的泛型機(jī)制是在編譯級(jí)別實(shí)現(xiàn)的,因此編譯器生成的字節(jié)碼文件中不包含泛型的類型信息。
?泛型的上界
🌈語法:
class 泛型類名稱<類型形參 extends 類型邊界> {...}
注意與繼承了其它泛型類的泛型類區(qū)別
🌈例子:
public class MyArray<E extends Number> {...}
?這里只接收Number的子類作為類型參數(shù)
MyArray<Integer> l1;???????? // 正常,因?yàn)?Integer 是 Number 的子類型
MyArray<String>?l2; ????????// 編譯錯(cuò)誤,因?yàn)?String 不是 Number 的子類型
沒有指定類型上界時(shí),可視為<E extends Object>?
🌈復(fù)雜例子:
public class MyArray<E extends Comparable<E>> {...}
這里表示類型參數(shù)E必須是實(shí)現(xiàn)了Comparable<E>接口的任何類型,實(shí)現(xiàn)了這個(gè)接口后,
這個(gè)類的對(duì)象可以與其它同類型的對(duì)象進(jìn)行比較。
?泛型方法:
方法限定符 返回值類型 方法名稱(形參列表) { ... }
🌈方法示例:
public class Util {//靜態(tài)的泛型方法 需要在static后用<>聲明泛型類型參數(shù)public static <E> void swap(E[] array, int i, int j) {E t = array[i];array[i] = array[j];array[j] = t;}}
🌈?使用方法示例:
🚀可以類型推導(dǎo):
Integer[] a = { ... };swap(a, 0, 9);String[] b = { ... };swap(b, 0, 9);
🚀不使用類型推導(dǎo):
Integer[] a = { ... };Util.<Integer>swap(a, 0, 9);String[] b = { ... };Util.<String>swap(b, 0, 9)
🎉🎉本次內(nèi)容結(jié)束啦
🌹如有問題,歡迎評(píng)論區(qū)討論~~🌹
感謝支持🥰
?