Integer和int基本型別的比較
阿新 • • 發佈:2019-02-10
先看幾行程式碼
Integer a1 = 100;
Integer a2 = 100;
System.out.println("a1==a2:" + (a1 == a2));
Integer b1 = 200;
Integer b2 = 200;
System.out.println("b1==b2:" + (b1 == b2));
Integer c1 = new Integer(100);
Integer c2 = new Integer(100);
System.out .println("c1==c2:" + (c1 == c2));
int d1 = 100;
Integer d2 = new Integer(100);
System.out.println("d1==d2:" + (d1 == d2));
a1==a2:true
b1==b2:false
c1==c2:false
d1==d2:true
大家的答案是否和顯示的相同呢,如果和你想象的不同,那又是為什麼會產生這種情況呢?
包裝型別
這裡我們重複什麼是包裝型別,什麼是基本型別了。
包裝型別的解釋:
- 當我們對兩個基本型別進行比較時,JVM是直接比較他們的他們的值
int a = 10;
int b = 10;
System.out.println(a == b);//true
- 當我們對兩個包裝型別比較時,JVM通過比較他們的地址來判斷是否是同一個物件。例如下面的而例子,c1和c2都是new出來的新物件,因此c1==c2的值肯定不同,他們只是擁有相同value值的Integer物件。
Integer c1 = new Integer(100);
Integer c2 = new Integer(100);
System.out.println("c1==c2:" + (c1 == c2));//false
當我們對兩個包裝型別比較時,還有一種情況,就是不通過new來建立Integer,而是通過JVM自動把int基礎型別轉換成Integer物件(下面稱為封包)。如以下例子:
Integer a1 = 100; Integer a2 = 100; System.out.println("a1==a2:" + (a1 == a2));//true Integer b1 = 200; Integer b2 = 200; System.out.println("b1==b2:" + (b1 == b2));//false
為什麼兩個幾乎一樣的程式碼結果不同呢?讓我們來看下JVM的指令操作:
從上圖可以看出,在封包的過程中其實就是呼叫了Integer.valueOf()方法把int基本型別轉換成了Integer物件。
public static Integer valueOf(int i) {
//IntegerCache.low=-128,IntegerCache.high=127
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}
在valueOf方法中對i進行了判斷,如果在[-128,127]之間會從快取中取出相應的Integer物件,而不是重新new一個Integer物件,所以當我們比較100的時候是返回的true,而200則是返回的是false。
4. 當我們把一個Integer和一個int物件比較時,是通過從Integer取出value和int值比較
int d1 = 100;
Integer d2 = new Integer(100);
System.out.println("d1==d2:" + (d1 == d2));