1. 程式人生 > >JavaSE之包裝類

JavaSE之包裝類

Object類可以接受所有引用資料型別。然而在Java中,資料型別分為基本資料型別和引用資料型別那麼基本資料型別如何處理呢?所以在Java中我們為了處理基本資料型別,就出現了包裝類。

包裝類的基本原理

包裝類就是將基本資料型別封裝到類中。 範例:自己定義一個包裝類

class IntDemo{
    private int val;
    public IntDemo(int val){
        this.val=val;
    }
    public int intValue(){
        return this.val;
    }
}
public class Test {
    public static void main(String[] args) {
      IntDemo intDemo=new IntDemo(10);
        System.out.println(intDemo.intValue()+20);
    }
}

這個時候的IntDemo實際上就是int資料型別的包裝類,利用IntValue就可以實現基本資料型別變為物件的需求。 範例:IntDemo的使用

public class Test {
    public static void main(String[] args) {
      IntDemo intDemo=new IntDemo(20);
      Object obj=new Object();
      //向下轉型,需要強轉
        obj=new IntDemo(10);
       intDemo=(IntDemo)obj;
        System.out.println(intDemo.intValue()+20);//取出裡面的基本資料型別進行操作
    }
}

結論:將基本型別包裝為一個類物件的本質就是使用Object進行接收處理,這樣Object類就可以接收Java中所有的資料型別。

包裝類的分類

Java中有8種資料型別,如果每種資料型別都按照以上方式編寫,就會存在一下問題: 1.開發中程式碼重複 2.在進行數學計算的時候,必須利用明確的方法將包裝的資料取出來後才可以進行運算。所以Java為了方便開發,專門提供了包裝類的使用,而對於包裝類的使用,提供了兩種型別。

物件型包裝類

物件型包裝類(Object的直接子類),有兩種:Boolean(boolean)和Character(char)

數值型包裝類

數值型包裝類(Number的直接子類),有六種:Byte(byte)、Double(double)、Short(short) 、Long(long)、Integer(int)、Float(float)

裝箱與拆箱

在包裝類與基本資料型別處理中存在兩個概念: 裝箱:將基本資料型別變為包裝類物件,利用每一個包裝類提供的構造方法實現裝箱處理。 拆箱:將包裝類中包裝的基本資料型別取出。利用Number類中提供的XXValue()實現拆箱處理。 範例:以int和Integer舉例

public class Test {
    public static void main(String[] args) {
        //裝箱
        Integer i=new Integer(10);
        //拆箱
        int ret=i.intValue();
        System.out.println(ret+20);//取出裡面的基本資料型別進行操作
    }
}

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

public class Test {
    public static void main(String[] args) {
        //自動裝箱
        Integer i=10;
        //自動拆箱
        int ret=i+20;
        System.out.println(ret);
    }
}

這個時候依然存在有“==”和“equals”問題 阿里編碼規範:所有相同型別的包裝類物件之間值的比較,全部使用equals方法比較。 範例:

public class Test {
    public static void main(String[] args) {
        Integer num1=new Integer(10);
        Integer num2=10;
        Integer num3=10;
        Integer num4=200;
        Integer num5=200;
        System.out.println(num1==num2);//false
        System.out.println(num2==num3);//true
        System.out.println(num4==num5);//false
    }
}

我們來觀察上面程式碼的執行結果,“= =”比較的是堆上的記憶體地址,num1和num2所指向的記憶體地址不一樣,所以輸出false;當沒有重新開闢空間的時候,num2和num3會有一個入池操作,兩個物件指向同一個堆記憶體,所以輸出true;那麼問題來了,按理來說num4和num5也應該入池兩個物件指向同一個堆記憶體,輸出true,但是最後結果輸出false呢? 說明:對於Integer var=?在-128值127範圍內的賦值,Integer物件是在物件池中產生,會複用已有的物件,這個區間內的Integer值可以直接使用“= =”進行判斷,但是這個區間之外的所有資料,都會在堆上產生,並不會複用已有物件,這是一個大坑,推薦使用equals方法進行值判斷。 阿里編碼規範:使用int還是Integer?

  1. 【強制】所有的POJO(簡單Java類,Bean(只有基本屬性、構造方法和getter、setter))類屬性必須使用包裝資料型別。
  2. 【強制】RPC(遠端方法呼叫)方法的返回值和引數必須使用包裝資料型別。
  3. 【推薦】所有的區域性變數使用基本資料型別。

字串與基本型別轉換

以後進行各種資料的輸入,一定都是字串型別的接收。所以在開發之中,如何將字串變為各個資料型別,這個時候就需要包裝類支援。 1.String變為int型別(Integer類): public static int parseInt(String s) 2.String變為double型別(Double類): public static double parseDouble(String s) 3.String變為Boolean型別(Boolean類): public static boolean parseBoolean(String s) 範例:將字串變為int型

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

範例:將字串變為double型

public class Test {
    public static void main(String[] args) {
        String str2="123.123";
        double num2=Double.parseDouble(str2);
        System.out.println(num2);
    }
}

需要注意的是,將字串轉為數字的時候,字串的組成有非數字,那麼轉換就會出現錯誤(NumberFormatException)。但是字串與boolean轉換就不受此影響。 範例:

public class Test {
    public static void main(String[] args) {
        String str1="hello HL";
        boolean bol=Boolean.parseBoolean(str1);
        System.out.println(bol);//false
    }
}

那麼如果現在要將基本資料型別變為字串: 1.任何資料型別使用了“+”連結空白字串就變為了字串型別。 2.使用String類中提供的valueOf()方法,此方法不產生垃圾。 範例:

public class Test {
    public static void main(String[] args) {
       int num=12345;
       String str1=num+"HL";
        System.out.println(String.valueOf(num));
        System.out.println(str1);

    }
}