今天做了一道題目題目如下:
Integer a=10; Integer b=10; System.out.print(a==b); Integer c=200; Integer d=200; System.out.print(c==d);
請說出輸出:
答案為:true,false
是不是很奇怪?
翻原始碼去哈哈;
檢視Integer.value(int i)方法
public static Integer valueOf(int i) { if (i >= IntegerCache.low && i <= IntegerCache.high)//判斷如果大於low或者小於high return IntegerCache.cache[i + (-IntegerCache.low)];//從這個cache中取出返回 return new Integer(i);//返回新例項 }
檢視內部類
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");//獲取jvm引數 if (integerCacheHighPropValue != null) { try { 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);//擔心虛擬機器陣列過大判斷了一下取兩者最小值 } catch( NumberFormatException nfe) { // If the property cannot be parsed into an int, ignore it. } } high = h; cache = new Integer[(high - low) + 1];//建立陣列 int j = low; for(int k = 0; k < cache.length; k++) cache[k] = new Integer(j++);//第一步先將這個物件陣列建立出來 // range [-128, 127] must be interned (JLS7 5.1.7) assert IntegerCache.high >= 127;//Debug 斷言一下 } private IntegerCache() {} }
可以看到還是可以設定jvm的引數的java.lang.Integer.IntegerCache.high來設定這個最大或者最小快取區,但是會導致這個Integer的cache陣列的大小變大
在沒設定引數的時候當Integer在-128到127之間的時候,會從cache陣列中取出該物件,這樣兩者比較就是相同的啦。
上面的面試題也就可以解釋啦