1. 程式人生 > >JAVA中Integer及其資料緩衝池

JAVA中Integer及其資料緩衝池

在寫本節內容前,首先說明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。