你知道在Java中Integer和int的這些區別嗎?
一、基本概念(重要)
- Integer 是 int 的包裝類,int 則是 java 的一種基本數據類型;
- Integer 變量必須實例化後才能使用,而int變量不需要;
- Integer 實際是對象的引用,當new一個 Integer時,實際上是生成一個指針指向此對象;而 int 則是直接存儲數據值;
- Integer的默認值是null,int的默認值是0。
二、拓展
基於以上的一些概念,這裡我們拓展一下,對於Integer包裝類型與int基本數據類型之間數值相互比較的結果進行一下說明,這個也可能在面試當中會被問到。
三、new Integer()與new Integer()的比較
下面的代碼大傢覺得結果是什麼呢?大傢可以先自己想一想然後再繼續往下看。
public static boolean comp(){ Integer i1=new Integer(10); Integer i2=new Integer(10); return i1==i2; }
Integer 變量必須實例化後才能使用,也就是我們必須new Integer()之後才可以使用,而我們知道,任何對象隻要是new出來的都會放在堆內存中,同時該變量存儲指向堆內存的地址,隻要new出來的對象就是一個新對象,也就是說i1和i2指向的兩個不同的對象,為瞭證明這一點,我們通過javap -v 看一下字節碼,也能看的很清楚。
因為是兩個不同的對象,所以上面的結果是false。
四、Integer與new Integer()的比較
再看下面的代碼,Integer變量 和 new Integer() 變量比較
public static boolean comp1(){ Integer i1=new Integer(10); Integer i2=10; return i1==i2; }
因為 Integer變量 指向的是 java 常量池中的對象,而 new Integer() 的變量指向堆中新建的對象,兩者在內存中的地址不同,兩者比較的話永遠為 false。
五、Integer與Integer的比較
public static void comp2(){ Integer i = 100; Integer j = 100; System.out.print(i == j); Integer m = 128; Integer n = 128; System.out.print(m == n); }
這裡為什麼會列舉兩個呢?大傢往下看。
其實Integer i = 100 在編譯時,會翻譯成為 Integer i = Integer.valueOf(100),而 java 對 Integer類型的 valueOf 的定義如下:
這裡的low和high分別為-128和127。
閱讀源碼我們可以很清晰的看到,java對於-128到127之間的數,會進行緩存,所以 當Integer i 的值在 -128到127之間時,會將值進行緩存,下次再取Integer j(值在 -128到127之間)時,就會直接從緩存中取,就不會new瞭,這樣拿到的就是同一個對象。當Integer i 的值不在 -128到127之間時,每次都會重新new Integer(),那麼每次都會是不同的對象。所以看到這裡,大傢應該知道上面的兩個不同的比較的結果是什麼瞭把,前者為true,後者為false。
六、int 變量 與 Integer、 new Integer() 比較
int 變量 與 Integer、 new Integer() 比較時,隻要兩個的值是相等,則為true,需要說明的是包裝類Integer 和 基本數據類型int 比較時,java會自動拆包裝為int ,然後進行比較,實際上就變為兩個int變量的比較。
Integer i = new Integer(10); //自動拆箱為 int i=10; 此時,相當於兩個int的比較 int j = 10; System.out.print(i == j); //true
看完瞭以上的,大傢看看下面的比較大傢能否寫出正確的結果。
public static void comp3(){ int i = 128; Integer i2 = 128; Integer i3 = new Integer(128); System.out.println("i == i2 = " + (i == i2)); // Integer會自動拆箱為int,所以為true System.out.println("i == i3 = " + (i == i3)); // true,理由同上 Integer i4 = 127;// 編譯時被翻譯成:Integer i4 = Integer.valueOf(127); Integer i5 = 127; System.out.println("i4 == i5 = " + (i4 == i5));// true Integer i6 = 128; Integer i7 = 128; System.out.println("i6 == i7 = " + (i6 == i7));// false Integer i8 = new Integer(127); System.out.println("i5 == i8 = " + (i5 == i8)); // false Integer i9 = new Integer(128); Integer i10 = new Integer(128); System.out.println("i9 == i10 = " + (i9 == i10)); // false }
public static void comp4(){ Integer a = new Integer(127), b = new Integer(128); int c = 127, d = 128, dd = 128; Integer e = 127, ee = 127, f = 128, ff = 128; System.out.println(a == b); // false 因為a,b都是new出來的對象,地址不同所以為false System.out.println(a == c); // true a會自動拆箱為int類型 System.out.println(a == e); // false 指向的地址不同a是new出來的 System.out.println(e == c); // true e會自動拆箱為int類型 System.out.println(e == ee);// true Integer對 處於-128到127范圍之間,指向瞭同一片地址區域 System.out.println(b == f); // false 指向的地址不同b是new出來的 System.out.println(f == d); // true f自動拆箱為int類型 System.out.println(f == ff); /* * false 指向的不是同一片地址區域。 * 在Integer類型中,-128到127存放的是同一片區域地址, * 之外的數是另外開辟空間來進行 存儲的 */ System.out.println(d == dd); // true 不解釋 }
public static void comp5(){ Integer i01 = 59; int i02 = 59; Integer i03 =Integer.valueOf(59); Integer i04 = new Integer(59); System.out.println(i01 == i02);//true System.out.println(i01 == i03);//true System.out.println(i03 == i04);//false System.out.println(i02 == i04);//true }
public static void comp6(){ Integer i01 = 128; int i02 = 128; Integer i03 = Integer.valueOf(128); Integer i04 = new Integer(128); System.out.println(i01 == i02);//true System.out.println(i01 == i03);//false System.out.println(i03 == i04);//false System.out.println(i02 == i04);//true }
到此這篇關於你知道在Java中Integer和int的這些區別嗎?的文章就介紹到這瞭,更多相關Integer和int的區別內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- 詳談java中int和Integer的區別及自動裝箱和自動拆箱
- java兩個integer數據判斷相等用==還是equals
- Java修改Integer變量值遇到的問題及解決
- Java 包裝類型及易錯陷阱詳解
- Java常量池詳解