包裝類自動裝箱和拆箱原理
阿新 • • 發佈:2019-02-17
包裝類的自動裝箱和自動拆箱
包裝類的自動裝箱和拆箱是JDK1.5的新特性
一.首先:瞭解自動裝箱的過程
有兩種自動裝箱過程
第一種 (-128~127)之內 呼叫相應包裝類的valueOf()
例如:Integer i = 12; Integer a = 23;
這些過程由JDK 編譯器自動裝箱完成的 即 會自動呼叫 Integer.valueOf() 方法
上面實際為: Integer i = Integer.valueOf(12); Integer a = Integer.value(23);
其實在該範圍之內,底層中是通過陣列存的值,當在該範圍內再一次定義相同大小的值,如12,JDk它會在相應的數組裡找到該值是不是存在,如存在則數組裡存有12,則把它的引用給該物件,所以它們的地址是相等的.
例如:Integer a = 20; Integer b = 20;
System.out.println(b==a);//true
第二種 不在(-128~127)之內 直接 new 物件
例如: Integer i = 200; Integer a = 200;
實際為: Integer i = new Integer(200); Integer a = new Integer(200);
System.out.println(i==a);//false
注意:只要他們的實際值相同(基本型別數值) ,則它們的hashCode相等
二.自動拆箱的過程
自動拆箱是指將包裝類的型別直接賦值給對應的基本資料型別的變數;
例如: Integer i = 100; int a = i;
實際上底層呼叫了相應的xxxValue()方法: Integer i = 100; int a = i.intValue();
在包裝類進行與基本資料型別比較時 ,會存在自動拆箱的操作。
Integer in = 400;
int i = 400;
// 當包裝類和對應的基本型別在運算的時候會進行自動拆箱
System.out.println(in == i);//true
NaN
// NaN是唯一的一個值
// NaN與任何東西都不相等,包括自己本身
// System.out.println(Double.NaN == Double.NaN);//false
System.out.println(Double.isNaN(5.8 / 4.32));//false
System.out.println(Double.isNaN(0.0/0));//true