拆箱和裝箱
自動拆箱和裝箱是從JDK5.0纔開始有的,它方便了基本數據類型和其對應的包裝類型之>間的轉換。
將一個基本數據類型的值賦給其所對應的包裝類型稱爲裝箱;將一個基本數據類型包>裝類類型的值賦給其所對應的基本數據類型稱爲拆箱。
由於裝箱和拆箱的過程是自動進行的非人爲轉換,所以稱作爲自動裝箱和拆箱.。
//拆箱和裝箱:
//裝箱:將基本數據類型轉換爲包裝類
Integer a = 12;//將int類型轉換爲Integer類型
//拆箱:將包裝類類型轉換爲基本數據類型
int aa = a;
/*
自動拆箱和裝箱的過程由編譯器自動完成:
通過包裝類的valueOf方法將基本數據類型包裝成引用類型;
通過包裝類對象xxxValue方法將引用類型變爲對應的基本類型。
所以以上代碼經過編譯器編譯後爲:
*/
Integer a = Integer.valueOf(12);
int aa = a.intValue();
包裝類特點
1、緩存機制:
Java對部分經常使用的數據採用緩存技術,即第一次使用該數據則創建該數據對象並對其進行緩存,當再次使用等值對象時直接從緩存中獲取,從而提高了程序執行性能。
1、byte、short、int和long所對應包裝類的數據緩存範圍爲 -128~127(包括-128和127)
2、float和double所對應的包裝類沒有數據緩存範圍
3、char所對應包裝類的數據緩存範圍爲 0~127(包括0和127)
4、boolean所對應包裝類的數據緩存爲true和false
//1.Byte Short Integer Long 這幾個類型將-128~127進行了緩存
Integer b1 = 127;
Integer b2 = 127;
System.out.println(b1==b2);//因爲127被緩存了,所以二者地址相同
b1 = new Integer(127);
b2 = new Integer(127);
System.out.println(b1==b2);//但如果new一個新的對象,則不考慮緩存了
//2.Float Double類型無任何緩存
//3.Boolean類型的true和false均進行的緩存
//4.Character類型 將0~127進行了緩存
Character c1 = 0;
Character c2 = 0;
System.out.println(c1==c2);
結果爲:
true
false
true
2、自動拆箱:
基本數據類型和基本數據類型封裝型進行“==”運算符的比較時,基本數據類型封裝型會先自動拆箱變爲基本數據類型後再進行比較。
//自動拆箱:和基本數據類型進行比較時,會自動轉換爲基本數據類型
int c = 128;
Integer cc = 128;
Integer ccc = new Integer(128);
System.out.println(c==cc);
System.out.println(c==ccc);
System.out.println(cc==ccc);
結果爲:
true
true
false
包裝類中equals方法
基本數據類型包裝類中的equals方法用於比對相同包裝類中的值是否相等,如果兩者比較的包裝類類型不同則返回false。
Integer a = 128;
Integer b = 128;
Short c = 128;
System.out.println(a==b);
//由於128超過了緩存範圍,所以a和b地址不同,返回false
System.out.println(a.equals(b));
//雖然128超過了緩存範圍,但是由於a和b的包裝類以及值均相同,所以返回true
System.out.println(a.equals(c));
//雖然a和c的值相同,但由於包裝類不同,所以返回false
結果:
false
true
false
包裝類中parseXXX方法
基本數據類型包裝類中的parseXXX(String s)方法用於將字符串類型數據轉換爲相應的基本數據類型(除了Character類)
//將字符串轉換爲其他數據類型
int a = Integer.parseInt("-128");
System.out.println(a);
long b = Long.parseLong("127");
System.out.println(b);
double c = Double.parseDouble("1.11");
System.out.println(c);
boolean e = Boolean.parseBoolean("true");
System.out.println(e);
結果:
-128
127
1.11
true
注意:char類型包裝類Character沒有相應的parseXXX方法。