Integer型別的數值比較案例分析
阿新 • • 發佈:2021-10-08
Integer
是int
的的包裝類,在Java5之後,可以進行自動裝箱和自動拆箱,也就是Integer
和int
可以進行轉換本文以一個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)
,而IntegerCache
是Integer
的內部類,原始碼如下:
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 == b 為true
,c == d 為false