Integer物件範圍(-128-127)之間
阿新 • • 發佈:2019-02-02
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
總結:實際開發中遇見問題一定要檢視原始碼,也要看英文註釋,萬變不離其宗!