JavaSE之包裝類
包裝類的基本原理
包裝類就是將基本資料型別封裝到類中。 範例:自己定義一個包裝類
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?
- 【強制】所有的POJO(簡單Java類,Bean(只有基本屬性、構造方法和getter、setter))類屬性必須使用包裝資料型別。
- 【強制】RPC(遠端方法呼叫)方法的返回值和引數必須使用包裝資料型別。
- 【推薦】所有的區域性變數使用基本資料型別。
字串與基本型別轉換
以後進行各種資料的輸入,一定都是字串型別的接收。所以在開發之中,如何將字串變為各個資料型別,這個時候就需要包裝類支援。 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);
}
}