1. 程式人生 > >Integer自動裝箱超出賦值範圍

Integer自動裝箱超出賦值範圍

//在-128~127 之外的數
Integer i1 =200;  
Integer i2 =200;          
System.out.println("i1==i2: "+(i1==i2));                   
// 在-128~127 之內的數
Integer i3 =100;  
Integer i4 =100;  
System.out.println("i3==i4: "+(i3==i4));

結果為:false;    true;

首先,i1,i2是Integer類的例項,因此“==”比較的是兩個例項的記憶體地址。
因為整型的包裝類存在常量池,一次性把從-128到127之間的所有數都初始化了.當你使用這些數的時候不是建立新物件而是直接從這個常量池裡面取值.所以當你賦值100的時候是取的常量池裡的100,因此兩個物件
記憶體地址
一樣.而賦值200的時候兩個物件分別new物件,因此記憶體地址不同.

以下是Integer原始碼的常量池實現:

private static class IntegerCache {
    static final int high;
    static final Integer cache[];
    static {
        final int low = -128;
        // high value may be configured by property
        int h = 127;
        if (integerCacheHighPropValue != null) {
        // Use Long.decode here to avoid invoking methods that
        // require Integer's autoboxing cache to be initialized
        int i = Long.decode(integerCacheHighPropValue).intValue();
        i = Math.max(i, 127);// Maximum array size is Integer.MAX_VALUE
        h = Math.min(i, Integer.MAX_VALUE - -low);
        }
        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(){}
}

轉載地址