1. 程式人生 > >Integer物件範圍(-128-127)之間

Integer物件範圍(-128-127)之間

java中如果Integer不是new出Integer物件,而是直接賦值如:

             Integer b1 = 12;

    Integer b2 = 12;

這種情況是在常量池中開闢出同一個空間來儲存12,所以b1和b2都指向12,如下圖所示:


接下來說說,Integer的緩衝範圍,因為不是在堆區new一個物件,那麼在常量池中就必須對其的大小範圍做出一個規定,

有一個規範叫JSL(Java Language Specification,java語言規範)對Integer的緩衝做了約束,規定其範圍為:(-128-127)之間,如下JDK原始碼:


那麼如果超出範圍會怎樣呢?再看其JDK原始碼:


如果超出了範圍,會從堆區new一個Integer物件來存放值。

其實有上圖第二行程式碼:static final int low = -128;規定了下線為-128,但是最大範圍沒有確定下來,這個設計是方便優化或擴充套件JVM來預留的。

固定了緩衝的下限,但是上限可以通過設定JDK的AutoBoxCacheMax引數調整如下JDK原始碼中的註釋也給出了相關說明:


好了,那麼有了上面的原理剖析,下面的幾個例子也就不難理解了:

 Integer a1 = new Integer(12);
	     Integer a2 = new Integer(12);
	     Integer b1 = -129;
	     Integer b2 = -129;
	     Integer c1 = 128;
	     Integer c2 = -128;
	     System.out.println(a1 == a2);   //false
	     System.out.println(b1==b2);     //false 
	     System.out.println(c1 == c2);   //false

總結:實際開發中遇見問題一定要檢視原始碼,也要看英文註釋,萬變不離其宗!