1. 程式人生 > >包裝類(Integer/Boolean等、字串與基本資料型別轉化,-127-128自動裝箱入池)

包裝類(Integer/Boolean等、字串與基本資料型別轉化,-127-128自動裝箱入池)

為什麼要有包裝類?
Object類可以接收所有引用資料型別。然而在Java中,資料型別分為基本資料型別和引用資料型別,那麼基本資料型別如何處理呢?
使用包裝類 :包裝類是將基本資料型別封裝到類中,因為Object無法接受基本資料型別,封裝成類後就可以用Object類來接收。
簡單定義一個int的包裝類:

class IntDemo
{
    private int num;
    public IntDemo(int num)
    {
        this.num=num;
    }
    public int value()
    {
        return this.num;
    }
}
public class Demo
{
    public static void main(String[] args)
    {
        Object ob=new IntDemo(10); //子類物件向上轉型
        IntDemo a=(IntDemo)ob;  //向下轉型,
        System.out.println(a.value()); //取出裡面的基本資料型別操作
    }
}

將基本資料型別包裝為一個類物件的本質就是使用Object進行接收處理。
Java為了方便開發,定義了包裝類的使用,即可以直接使用包裝類。
包裝類的分類:

  • 物件型包裝類(Objetc的直接子類),不存在數值轉換異常:Boolean類(boolean)、Character類(char);
  • 數值型包裝類(Number的直接子類),存在數值轉換異常(執行時異常):Byte類(byte) 、 Short類(short) 、Long類(long)、Double類(double)、Float類(flaot)、Integer類(int)。
    拆箱與裝箱
    拆箱和裝箱指基本資料型別與響應包裝類的資料處理。
  • 裝箱:將基本資料型別變為包裝類物件,利用每個包裝類提供的構造方法實現裝箱。
  • 拆箱:將包裝類包裝的基本資料型別值取出,利用Number類提供的xxValue( )實現。
public class Demo
{
    public static void main(String[] args)
    {
        Integer a=new Integer(10); //裝箱
        int data=a.intValue();  //拆箱
        System.out.println(data); //10
    }
}

以上操作採用的是手工的裝箱和拆箱。在JDK1.5之後,提供了自動拆裝箱的機制,最為重要的是,由於此類機制的
存在,可以直接利用包裝類的物件進行各種數學計算。

public class Demo
{
    public static void main(String[] args)
    {
        Integer a=10;
        System.out.println(a*3);//30
    }
}

包裝類的==和equals

public class Demo
{
    public static void main(String[] args)
    {
        Integer a1=new Integer(10);
        Integer a2=new Integer(10);
        System.out.println(a1==a2);  //false 因為==比較地址
        System.out.println(a1.equals(a2)); //true  比較物件內容

        Integer a3=20;
        Integer a4=20;
        Integer a5=170;
        Integer a6=170;
        System.out.println(a3==a4); //ture 因為對於直接賦值,如果值在-127-128之間,會入池
        System.out.println(a5==a6); //false   值沒有在-127-128之間,不會入池,會在堆上產生
    }
}

阿里編碼規範:
所有相同型別的包裝類物件之間的值比較,全部使用equals方法比較。
說明:對於Integer var=? 在-128-127之間的賦值,Integer物件在Integer常量池產生,會複用已有物件,這個區間內的Integer值可以直接用==判斷。除此之外的所有資料,都會在堆上產生,並不會複用已有物件。,這是一個大坑,推薦使用 equals 方法進行判斷。
使用Integer還是int ?

  • 強制:所有的POJO類(簡單JAVA類,Bean)屬性必須使用包裝型別(簡單JAVA類是隻有屬性、getsetter、setsetter);
  • 強制:RPC方法的返回值和引數必須使用包裝型別;
  • 推薦:所有的區域性變數(方法中宣告變數)使用基本型別。

字串與基本資料型別的轉換

  • 將字串轉為基本資料型別(靜態方法):
    呼叫各個包裝類.parseXX(String str);如:Integer.parseInt(String str) ;
 - String變為int 型別(Integer類):public static int parseInt(String s) throws NumberFormatException
 - String變為double型別(Double類):public static double parseDouble(String s) throws NumberFormatException
 - String變為Boolean型別(Boolean類):public static boolean parseBoolean(String s)

將字串轉化為基本資料型別:
將 字 符 串 轉 為 數 字 的 時 候 , 字 符 串 的 組 成 有 非 數 字 , 那 麼 轉 換 就 會 出 現 錯 誤(NumberFormatException),以後就因為這個異常,我們要寫一堆程式來回避。

public class Demo
{
    public static void main(String[] args)
    {
       String str1="123";
       int a=Integer.parseInt(str1) ;
       System.out.println(a); //123

       //字串字母
       String str2="123abc";
       //int a2=Integer.parseInt(str2); //會報錯:NumberFormatException.forInputString(NumberFormatException.
      
       boolean bo=Boolean.parseBoolean(str2);
       System.out.println(bo); //false,因為對於Boolean來說不是true,就是false
    }
}

將基本資料型別轉化為字串:

  • 因為字串是最高型別:" "(空字串)+基本型別,就會轉為String類;
  • 使用String類的valueof(基本型別)靜態方法,此方法不產生垃圾空間,推薦使用。
public class Demo
{
    public static void main(String[] args)
    {
       String str1=String.valueOf(100); //將int轉為String
       String str2=String.valueOf(10.3); //double 轉為String
       String str3=""+'a';   //將字元轉為字串 
       System.out.println(str1); //100
       System.out.println(str2); //10.3
       System.out.println(str3); //a
    }
}