包裝類(Integer/Boolean等、字串與基本資料型別轉化,-127-128自動裝箱入池)
阿新 • • 發佈:2018-10-31
為什麼要有包裝類?
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
}
}