1. 程式人生 > >Integer和int基本型別的比較

Integer和int基本型別的比較

先看幾行程式碼

        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

大家的答案是否和顯示的相同呢,如果和你想象的不同,那又是為什麼會產生這種情況呢?

包裝型別

這裡我們重複什麼是包裝型別,什麼是基本型別了。
包裝型別的解釋:

  1. 當我們對兩個基本型別進行比較時,JVM是直接比較他們的他們的值
        int a = 10;
        int b = 10;
        System.out.println(a == b);//true
  1. 當我們對兩個包裝型別比較時,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
  1. 當我們對兩個包裝型別比較時,還有一種情況,就是不通過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的指令操作:

In1.png

從上圖可以看出,在封包的過程中其實就是呼叫了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));

int2.png