int 是基礎(chǔ)類型,Integer是引用類型,是int的包裝類型。
int使用的是值傳遞。Integer使用的是引用傳遞。
java的基礎(chǔ)類型都有對應(yīng)的包裝類型。
因為int是基礎(chǔ)類型,所以int是分配在常量區(qū)。Integer是引用類型,所以它是分配在堆里面的。
類裝載的時候,在類加載階段。會將int類型的變量賦值為0 ,如果初始化階段沒有賦值的話,那么int類型的變量的初始值就是0 。 對于對象類型,在類加載階段,會賦值為null, 所以在初始化階段如果沒有指定值的話,那么Integer類型的變量初始的值就是null。
使用int類型有3種方式
//直接聲明變量賦值。
int i = 1;
//這里由于自動裝箱拆箱,所以可以直接將值賦值給對象。
//這里編譯過后會變成 Integer i1 = Integer.valueOf(1);
Integer i1 = 1;
//使用new創(chuàng)建對象。
Integer i2 = new Integer(1);
int和Integer的對比如下
public static void main(String[] args) {
int i1= 1;
Integer i2 = 1;
Integer i3 = new Integer(1);
//true 因為i2會被自己拆箱成1
System.out.println( i1 == i2);
//true 因為i3會被自己拆箱成1
System.out.println( i1 == i3);
//false 因為Integer會自動在類加載的時候,自動生成一個Integer數(shù)組,保存著 -128 ~ 127 的對象
//i2 會被編譯成 i2= Integer.valueOf(1); valueOf方法會去獲取預(yù)先緩存的 -128 ~ 127 對象。
// 所以這里判斷的是 i2(這個在加載階段就創(chuàng)建的Integer對象) 和 i3(在執(zhí)行階段才創(chuàng)建的對象) 是否同一個對象,當(dāng)然不是同一個對象。
System.out.println( i2 == i3);
Integer i4 = 2;
Integer i5 = 2;
//true 因為i4 和 i5 都是Integer類緩存的對象。
System.out.println(i4 == i5);
Integer i6 = 128;
Integer i7 = 128;
//false ,因為i6 和 i7都大于127。所以是new出來的對象,而不是緩存的對象。
System.out.println(i6 == i7 );
Integer i8 = new Integer(3);
Integer i9 = new Integer(3);
//false i8 和 i9都是new出來的對象,是不同的引用。所以是false
System.out.println(i6 == i7 );
//true equals方法是獲取int值進行對比。 他們的值都是3 所以是true
System.out.println(i8.equals(i9));
}
需要增加的理解: 自動裝箱和拆箱