Java常用類——包裝類 小白版個人推薦

椰椰210162701037發表於2024-08-19

包裝類及自動裝箱/拆箱

包裝類是將Java中的八種基本資料型別封裝成的類,所有資料型別都能很方便地與對應的包裝類相互轉換,以解決應用中要求使用資料型別,而不能使用基本資料型別的情況。

int a = 10; //基本型別的資料
Integer b = new Integer(10); //包裝類表示的資料

包裝類的特點

  • 所有包裝類都是final型別(不能派生子類);
  • 例項化包裝類物件後,物件中儲存的基本型別資料不能再改變;
  • 包裝類封裝大量有用的方法(如資料型別轉換、判斷大小寫、最大值、最小值等);
  • 除Character類和Boolean類繼承於Object類,其他的包裝類都繼承於Number類。

基本資料型別和包裝類

基本資料型別 包裝類
boolean Boolean類
byte Byte類
short Short類
int Integer類
long Long類
char Charactor類
float Float類
double Double類

包裝類的共同點

  1. 包裝類中包含的值不改變( 包裝類例項化後不能修改儲存的值 );
  2. 包裝類有兩個構造器
    • Integer(int value) ---指定int值的構造物件
    • Integer(String s) ---指定String值的構造物件
  3. 包裝類中都有xxxValue()方法
    • int intValue() ---返回包裝類物件的int值
    • float floatValue() ---返回包裝類物件的float值
  4. 包裝類中都有兩個ValueOf()方法
    • static Integer valueOf(int i) ---指定int值的Integer例項
    • static Integer valueOf(String s) ---指定String值的Integer例項

自動裝箱和拆箱

自動裝箱和自動拆箱是基本資料型別與包裝類之間的轉換機制(透過編譯器自動完成)
基本資料型別 ---自動裝箱--->包裝類;
包裝類 ---自動拆箱 --->基本資料型別。
例:以int型別和Integer型別為例

public class Test01 {
    public static void main(String[] args) {
        // 自動裝箱 int -> Integer
        int i = 10;
        Integer integer1 = i;
        System.out.println(integer1);

        //自動拆箱 Integer -> int
        int j = 20;
        Integer integer2=j;
        int k = integer2;
        System.out.println(j);
    }
}

包裝型別和String型別的相互轉換

例:以 Integer 和 String 為例

public class Test03 {
    public static void main(String[] args) {
        //包裝類Integer -> String
        Integer i = 100; //自動裝箱
        //方式1
        String str1 = i+"";
        //方式2 呼叫Integer的toString()方法
        String str2 = i.toString();
        //方式3 呼叫靜態方法String.valueOf()
        String str3 =String.valueOf(i);

        System.out.println(str1);
        System.out.println(str2);
        System.out.println(str3);

        //String -> 包裝類Integer
        String str4 = "123";
        //方式1 呼叫包裝類的parseXXX()方法
        Integer i2 = Integer.parseInt(str4);//自動拆箱
        //方式2
        Integer i3 = new Integer(str4); //構造器

        System.out.println(i2);
        System.out.println(i3);

    }
}

例題1:
以下兩個題目輸出結果相同嗎?為什麼?

Object obj1 = true?new Integer(1):new Double(2.0); //三元運算子(是一個整體)
System.out.println(obj1);
//執行結果 
// 三元運算子是一個整體,精度最高的是double,所以結果是1.0
1.0
Object obj2;
if(true){
    obj2 = new Integer(1);
}else{
    obj2 = new Double(2.0);
}
System.out.println(obj2);
//執行結果
//if、else是分別獨立的語句,是什麼輸出什麼
1

例題2(Integer類):

public class Test04 {
    public static void main(String[] args) {
        Integer i1 = new Integer(10);
        Integer i2 = new Integer(10);
        System.out.println(i1 == i2); // false (判斷i1和i2是否指向同一個物件)
        System.out.println(i1.equals(i2)); // true

        Integer j1 = 20; //底層 Integer.valueOf(20) {-128~127}直接返回物件引用,否則建立新的物件new Integer()
        Integer j2 = 20; //底層 Integer.valueOf(20)
        System.out.println(j1 == j2); // true

        Integer k1 = 128; //超出{-128~127}範圍,建立新的物件new Integer()
        Integer k2 = 128;
        System.out.println(k1 == k2); // false (判斷k1和k2是否指向同一個物件)
    }
}

例題3(Integer):

public class Test05 {
    public static void main(String[] args) {
        Integer i1 = new Integer(127);
        Integer i2 = new Integer(127);
        System.out.println(i1 == i2); // false i1和i2是兩個不同的物件

        Integer i3 = new Integer(128);
        Integer i4 = new Integer(128);
        System.out.println(i3 == i4); // false  i3和i4是兩個不同的物件

        Integer i5 = 127;  //底層Integer.valueOf(127)
        Integer i6 = 127;
        System.out.println(i5 == i6); // true

        Integer i7 = 128;  //底層new Integer(128)
        Integer i8 = 128;
        System.out.println(i7 == i8); // false 同i3和i4

        Integer i9 = 127;
        Integer i10 = new Integer(127);
        System.out.println(i9 == i10); // false

        int a1 = 127;
        Integer b1 = 127;
        System.out.println(a1 == b1); // true  只要有基本資料型別,判斷的是值是否相等,不管是int還是Integer

        int a2 = 128;
        Integer b2 = 128;
        System.out.println(a2 == b2); // true 同上

    }
}

很多知識來源於韓順平Java課程,講的非常好,非常詳細,感興趣的同學可以去學習。
如有錯誤,請大家批評指正,共同進步。

相關文章