Java總結:裝箱拆箱之int(Integer)

Java有8種基本數據類型:byte,short,int,long,float,double,char,boolean,它們沒有方法和屬性,而包裝類就是為了使其擁有方法和屬性,實現對象化交互。

<code>byte包裝類Byte;1字節;範圍:[-2^7 ~ 2^7)
short包裝類Short;2字節;範圍:[-2^15 ~ 2^15)
int包裝類Integer;4字節;範圍:[-2^31 ~ 2^31)
long包裝類Long;8字節;範圍:[-2^63 ~ 2^63)
float包裝類float;4字節
double包裝類Double;8字節
char包裝類Character;1字節
boolean包裝類Boolean;1bit/<code>

包裝類屬於引用類型,new對象時會在堆中創建對象,因此a1b1的內存地址不同

<code>Integer a1 = new Integer(10);
Integer b1 = new Integer(10);
Integer c1 = new Integer(300);
Integer d1 = new Integer(300);
System.out.println(a1 == b1);//false
System.out.println(c1 == d1);//false
System.out.println(a1.equals(b1));//true
System.out.println(c1.equals(d1));//true/<code>

基本數據類型轉換為包裝類型的過程叫裝箱,反之則是拆箱。

在裝箱過程中,如果值在[-128,127]之間則不會new Integer對象,而是直接從緩存(常量池)中獲取;所以a2b2都是取緩存中的同一個值,引用地址是一樣的,結果為true,而c2==d2的結果為false

<code>Integer a2 = -128;
Integer b2 = -128;
Integer c2 = 128;

Integer d2 = 128;
System.out.println(a2 == b2);//true
System.out.println(c2 == d2);//false/<code>

當Integer和int進行“==”比較時,會自動拆箱,Integer轉換為int類型,然後再比較

<code>Integer a3 = new Integer(3);
Integer b3 = new Integer(300);
System.out.println(a3 == 3);//true
System.out.println(b3 == 300);//true/<code>

當Integer類型進行運算時,會自動拆箱,把Integer類型轉換為int類型,可理解為b4+c4的結果為int類型,於是就變成了Integer和int做“==”比較

<code>Integer a4 = new Integer(40);
Integer b4 = new Integer(40);
Integer c4 = new Integer(0);
System.out.println(a4 == b4);//false
System.out.println(a4 == b4+c4);//true/<code>

Integer a5=30會自動裝箱,但不管是直接從常量池中取,還是在堆中new,都與b5 new的引用地址不一樣,用“==”比較時答案都為false

<code>Integer a5 = 30;
Integer b5 = new Integer(30);
Integer c5 = 300;
Integer d5 = new Integer(300);
System.out.println(a5 == b5);//false
System.out.println(c5 == d5);//false/<code>


分享到:


相關文章: