1. 程式人生 > >Java Interger類,兩對整數明明完全一樣,為何一個輸出true,一個輸出false

Java Interger類,兩對整數明明完全一樣,為何一個輸出true,一個輸出false

package text;


public class MethodOverload    {        
    public static void main(String[] args) {            
            Integer i1=100;
           
            Integer j1=100;
            
            System.out.println(i1==j1);

            
            Integer i2=129;
            
            Integer j2
=129; System.out.println(i2==j2); } }

執行結果

輸出結果表明i1和i2指向的是同一個物件,而i3和i4指向的是不同的物件。

下面看原始碼便知究竟,下面這段程式碼是Integer的valueOf方法的具體實現。

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

而其中IntegerCache類的實現為

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() {} } 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() {} }

從這2段程式碼可以看出,在通過valueOf方法建立Integer物件的時候,如果數值在[-128,127]之間,便返回指向IntegerCache.cache中已經存在的物件的引用;否則建立一個新的Integer物件。

上面的程式碼中i1和j2的數值為100,因此會直接從cache中取已經存在的物件,所以i1和j1指向的是同一個物件,而i2和j2則是分別指向不同物件。

以上參考https://www.cnblogs.com/aishangtaxuefeihong/p/4887030.html