1. 程式人生 > 實用技巧 >常用類-包裝類

常用類-包裝類

包裝類

概念

  • 官方文件的java.lang包中可檢視

  • 基本資料型別所對應的引用資料型別

  • Object可統一所有類,包裝類的預設值為Null

  • 對應關係

  • 基本資料型別無方法可用,想使用方法需轉換成包裝型別,下圖為官方文件中的Byte類的部分方法

型別轉換與裝箱、拆箱

概念
  • 基本資料型別儲存在棧空間中

  • 引用型別資料儲存在堆空間中

  • 裝箱、拆箱就是型別轉換

  • 裝箱就是將基本型別轉換成引用型別的過程(基本型別轉換成包裝類)

  • 拆箱就是將引用型別轉換成基本型別的過程(包裝類轉換成基本類)

  • 八種包裝類提供不同型別間的轉換方式

    • Number父類中提供六種共性方法

    • parseXXX()靜態方法,引用型別轉換為基本型別

    • valueOf()靜態方法,基本型別轉換為引用型別

  • 注意:需保證型別相容,否則丟擲異常

    String str = "12a";
    int i3 = Integer.parseInt(str);
    

    異常:Exception in thread "main" java.lang.NumberFormatException: For input string: "12a"

intInteger的轉換
  • Integer的相關方法

    • 構造方法

    • valueOf(int i)方法

    • intValue()

  • 裝箱

    //裝箱:轉換成包裝類
    //基本資料型別
    int num1 = 1;
    //建立Integer類進行轉換
    //1.用構造方法
    Integer integer1 = new Integer(num1);
    //2.valueOf()方法
    Integer integer2 = valueOf(num1);
    
  • 拆箱

    //拆箱:轉換成包裝類
    //建立Integer例項
    Integer integer3 = new Integer(2);
    //intValue()方法
    int num2 = integer3.intValue();
    
  • JDK1.5之後提供自動裝箱和拆箱

    //基本資料型別
    int num1 = 1;
    //自動裝箱
    Integer integer4 = num1;
    //自動拆箱
    int num4 = integer4;
    
基本型別和字串之間的轉換
  • 基本型別轉成String

    //1.基本型別轉換成String
    int num = 10;
    //1.1 加""
    String s1 = num+"";
    //1.2 靜態方法valueOf()
    String s2 = valueOf(num);
    //1.3 Integer的toString()
    Integer i1 = new Integer(num);
    String s3 = i1.toString(); 
    
  • String轉換成基本型別

    //2.String轉換成基本型別
    String str = "12";
    //2.1靜態方法parseXXX()
    int i2 = parseInt(str);
    //2.2Integer的parseInt
    int i3 = Integer.parseInt(str);
    
  • boolean的特殊情況

    //3.注意boolean字串形式轉成基本型別,"true"-->true,非"true"-->false
    String str1 = "true";
    String str2 = "yes";
    String str3 = "false";
    //用Boolean的parseBoolean方法
    boolean b1 = Boolean.parseBoolean(str1);
    boolean b2 = Boolean.parseBoolean(str2);
    boolean b3 = Boolean.parseBoolean(str3);
    System.out.println(b1);//輸出為true
    System.out.println(b2);//輸出為false
    System.out.println(b3);//輸出為false
    

整數緩衝區

概述
  • Java預先建立了256個常用的證書包裝類物件

  • 在實際應用中對已建立的物件進行復用

面試題
  • 程式碼

    //面試題,判斷值相同的兩個Integer例項是否相等
    //1.通過new Integer物件
    Integer integer1 = new Integer(100);
    Integer integer2 = new Integer(100);
    System.out.println(integer1 == integer2);//輸出為false
    //2.自動裝箱,值為100
    Integer integer3 = 100;
    Integer integer4 = 100;
    System.out.println(integer3 == integer4);//輸出為true
    //3.自動裝箱,值為200
    Integer integer5 = 200;
    Integer integer6 = 200;
    System.out.println(integer5 == integer6);//輸出為false
    
  • 分析

    • 將.class檔案反編譯(拖入XJad中),發現自動裝箱使用的是valueOf()方法

    • 檢視IntegervalueOf()原始碼

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

      發現Integer存在緩衝區(以陣列的形式存在於堆中),大於low、小於high的數直接返回緩衝區中的值,否則才建立新物件

    • 進一步檢視原始碼

      low=-128high=127,即Integer緩衝區包括大於-129,小於128的256個數,在這個範圍內的數值相同時,引用地址也相同

    • 題目解析

      • 1.通過new Integer建立了兩個例項,實質是在堆空間中開闢了兩個空間,在棧空間中的引用指向不同地址,所以兩個物件不相等,返回false

      • 2.通過自動裝箱即valueOf()方法,值為100,此時因為100處於整數緩衝區內,直接返回緩衝區中的地址,integer3integer4的引用地址相同,所用相等

      • 3.通過自動裝箱即valueOf()方法,值為200,此時因為200不在整數緩衝區內,所以要新建兩個物件,在堆中開闢兩個空間,所以引用地址不同,兩個值不相等

棧和堆簡要介紹

https://www.cnblogs.com/fsg6/p/12752222.html