1. 程式人生 > 其它 >Integer型別的數值比較案例分析

Integer型別的數值比較案例分析

Integerint的的包裝類,在Java5之後,可以進行自動裝箱和自動拆箱,也就是Integerint可以進行轉換本文以一個Integer型別的數值比較的例題,分析其中一個容易錯的點

問題:下面程式碼中輸入的結果為?

package Test01;

/**
 * @ClassName IntegerTest
 * @Author 長歌
 * @Date 2020/5/19 0:19
 * @Version 1.0
 */
public class IntegerTest {
    public static void main(String[] args) {
		//定義4個Integer的物件引用
        Integer a = 10, b = 10, c = 200, d = 200;
		//引用內容值的比較
        System.out.println(a.equals(b));
        System.out.println(c.equals(d));
		//引用的地址的比較
        System.out.println(a == b);
        System.out.println(c == d);
    }
}

在上面程式碼中,一眼看過去,可能會覺得結果是兩個true和兩個false,前面兩個比較的是引用內容的值,毫無疑問是true
那麼後兩個呢?比較的是引用物件的地址,所以都是false嗎?

我們都知道上面的 a、b、c、d四個變數都是Integer的物件引用,所有“==”比較的是引用的地址而不是值,按理說,後面兩個都是false,但事實上結果是:

可以看出來,除了System.out.println(a == b);的結果出乎意料的是true,其他都是如前面分析一樣

那麼為什麼 a == b為什麼為true呢?
我們來看下其中發生了什麼,首先,當我們給Integer物件賦一個int值的時候,會呼叫Integer

類的靜態方法valueOf()valueOf原始碼如下:

public static Integer valueOf(int i) {
        assert IntegerCache.high >= 127;
        if (i >= IntegerCache.low && i <= IntegerCache.high)
            return IntegerCache.cache[i + (-IntegerCache.low)];
        return new Integer(i);
    }

IntegerCache.low

<=i <=IntegerCache.high時,執行IntegerCache類裡面的方法,否則返回new Integer(i),而IntegerCacheInteger的內部類,原始碼如下:

private static class IntegerCache {
        static final int low = -128;
        static final int high;
        static final Integer cache[];

        static {
            // high value may be configured by property
            int h = 127;
            String integerCacheHighPropValue =
                sun.misc.VM.getSavedProperty("java.lang.Integer.IntegerCache.high");
            if (integerCacheHighPropValue != null) {
                int i = parseInt(integerCacheHighPropValue);
                i = Math.max(i, 127);
                // Maximum array size is Integer.MAX_VALUE
                h = Math.min(i, Integer.MAX_VALUE - (-low) -1);
            }
            high = h;

            cache = new Integer[(high - low) + 1];
            int j = low;
            for(int k = 0; k < cache.length; k++)
                cache[k] = new Integer(j++);
        }

        private IntegerCache() {}
    }

概括起來就是,如果int的值在 -128 ~ 127 之間,那麼不會new新的Integer物件,而是直接引用常量池中的Integer物件,即引用同一物件,所以 a == btruec == dfalse