JAVA中Integer及其資料緩衝池
阿新 • • 發佈:2018-12-26
在寫本節內容前,首先說明JDK1.5後增加的一個新特性:自動裝箱和拆箱
Integer i5=127;
i5=i5+100;
System.out.println(i5);
輸出結果為227
對於此段程式碼反編譯後的程式碼為:
Integer i5 = Integer.valueOf(127); //自動裝箱 i5 = Integer.valueOf(i5.intValue() + 100); //自動拆箱,再自動裝箱 System.out.println((new StringBuilder("i5:")).append(i5).toString());
下面對比兩段程式碼
Integer i1=new Integer(127);
Integer i2=new Integer(127);
System.out.println(i1==i2);
System.out.println(i1.equals(i2));
Integer i3=new Integer(128);
Integer i4=new Integer(128);
System.out.println(i3==i4);
System.out.println(i3.equals(i4));
輸出結果為
false true false true
i1,i2,i3,i4均為new的物件,存放在堆中,地址均不同,因此i1和i2,i3和i4均為false
第二段程式碼:
Integer i5=127;
Integer i6=127;
System.out.println(i5==i6);
System.out.println(i5.equals(i6));
Integer i7=128;
Integer i8=128;
System.out.println(i7==i8);
System.out.println(i7.equals(i8));
輸出結果為:
false false false true
看似一樣的程式碼為什麼產生了不同的結果?
由於自動裝箱是呼叫的Integer的value方法,通過檢視其原始碼:
public static Integer valueOf(int i) {
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
當符合i >= IntegerCache.low && i <= IntegerCache.high時返回IntegerCache.cache[i + (-IntegerCache.low)]
當不符合時返回new Integer(i)。
繼續檢視IntegerCache的原始碼,得到low為-128,high為127,即Integer的緩衝池大小為1個位元組。
則當Integer直接賦值時,值-128到127之間時,建立的物件存放在常量池中,直接從常量池中獲取資料。因此i6==i5為true。