1. 包裝類
1.1 基本數據類型與其對應的包裝類
1.2 裝箱與拆箱
1.2.1 裝箱的概念
裝箱:基本類型——>包裝類;拆箱:包裝類——>基本類型。
1.2.2 裝箱與拆箱的兩種方式
手動裝箱/拆箱:Integer i = new Integer(10);int j = i.intValuew()。
自動裝箱/拆箱:Integer i = 10; int j = i;
1.2.3 常用的類型轉換方法
Integer.parseInt("1223"):這個是將String類型轉化為int類型,String.valueOf()方法是將int類型轉化為String類型。
1.2.4 包裝類的緩存機制
為什麼當Integer i= 127,Integer j = 127,判斷 i == j 時會返回true,而i = 128,j = 128時,判斷會返回false。它其中的原理就是Byte、Short、Integer、Long 默認緩存-128~127的對象(節省內存),超出範圍則新建對象。因為這個原理所以導致了當 i 和 j都為128時,判斷他們是否相等會返回false。
1.2.3 包裝類的注意事項
- 自動拆箱的空指針異常(Integer i = null ,int j = i;直接報錯)→ 解決方案:先判空再使用。
- ==與equals混用(==比較的是地址,equals比較的是值)。→ 推薦:包裝類比較用equals或
compare方法。 - Float/Double 無緩存,避免用
==比較(如Float f1 = 1.0f; Float f2 = 1.0f; f1 == f2可能為 false)。 - 包裝類作為方法參數時,是 “值傳遞”(本質是對象引用的拷貝,修改不會影響原對象)。
2. 泛型
2.1 什麼是泛型
泛型就是“參數化類型”,允在許定義類,接口,方法時不指定具體對象,而是用類型佔位符(T\K\
L)表示,在使用時在指定具體類型。
2.2 泛型的使用
class 泛型類名稱<類型形參列表>,下面的T都是參數類型,等實例化對象時,傳真正的參數類型給它
class MyArray<T>{
public Object[] array = new Object[10];
public void setVal(int pos,T val){
this.array[pos] = val;
}
public T getVal(int pos){
return (T)this.array[pos];
}
}
public static void main1(String[] args) {
MyArray<Integer> myArray = new MyArray<Integer>();
myArray.setVal(0,1);
myArray.setVal(1,2);
myArray.setVal(2,3);
System.out.println(myArray.getVal(2));
}
2.3 泛型的擦除機制
在編譯時,Java會將泛型信息從代碼中移除,擦除後泛型類型會被替換為邊界類型Object類型,或者替換成我們給的指定類型。
擦除前:
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;
}
}
擦除後:
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;
}
}
2.4 泛型的上界
在定義泛型類時,有時候需要對傳入的類型進行約束,此時就要通過類型邊界來約束。
class 泛型名稱<類型形參 extends 類型邊界>
class MyArray<T extends Number>,這個就表示傳入的類型得為Number類或者是Number類的子類d
class MyArray<T extends Compare(T)>,這個就表示傳入的類型必須實現Coapare接口
2.5 通配符
?在泛型中使用就是通配符。通配符可以接收所有泛型類型就解決了下面的給Message傳入的是String類型,後面又給Message傳了Integer類型而導致調用fun方法出現的編譯錯誤,因為此時fun方法裏面的類型為String類型,Integer類型調用fun方法會導致編譯出錯。此時用通配符?就可以解決該問題。
public static void main(String[] args) {
Message<String> message = new Message<String>();
message.setMessage("HT is a cool girl");
fun(message);
Message<Integer> message1 = new Message<Integer>();
message1.setMessage(20050606);
fun(message1);
}
public static void fun(Message<?> message){
System.out.println(message.getMessage());
}