1. 包裝類

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

初識Java集合及包裝類和泛型的基本使用_拆箱

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。

初識Java集合及包裝類和泛型的基本使用_#java_02

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