下面這段代碼片段的輸出是什么诱咏?
Integer i1 = 127,i2 = 127,i3=128,i4=128;
System.out.println(i1==i2);
System.out.println(i1.equals(i2));
System.out.println(i3==i4);
System.out.println(i3.equals(i4));
答案如下
true
false
true
true
為什么是這樣呢允青?首先equals方法我們是可以理解的谬泌,應為比較的值嘛,所以i1和i2都是等的肆捕,但是java中的“==”是比較的地址,為什么i1和i2是等的盖高,i3和i4又是不等的呢慎陵?我們通過反編譯程序把上面代碼的字節(jié)碼反編譯一下眼虱,看看得到是什么
Integer i1 = Integer.valueOf(127);Integer i2 = Integer.valueOf(127);Integer i3 = Integer.valueOf(128);Integer i4 = Integer.valueOf(128);
System.out.println(i1 == i2);
System.out.println(i1.equals(i2));
System.out.println(i3 == i4);
System.out.println(i3.equals(i4));
我們在看看valueOf的源碼
public static Integer valueOf(int i) {
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}
我們可以看到如果i的值是>=-128并且是?<=127的(low,high分別是-128和127)席纽,那么java久就從一個緩沖里面讀取數(shù)據(jù)捏悬,這就可以?解釋我們上面存在的問題呢。其實這么緩存是指也是可以通過jvm參數(shù)進行修改的