new Integer(1) 與 Integer.valueOf(1) 的區別
阿新 • • 發佈:2020-06-24
關於 Java 字串 String 有一道很基礎的面試題,相信很多人都遇到過,就是 String s = "a" 和 String s = new String("a") 的區別是什麼?相信大家都能回答上來。
那麼你知道這三者有什麼區別麼?
Integer i = new Integer(1) ;
Integer i = Integer.valueOf(Integer i = 1 ;
複製程式碼
new Integer(1) 與 Integer.valueOf(1)
- new Integer(1) :會新建一個物件;
- Integer.valueOf(1) :使用物件池中的物件,如果多次呼叫,會取得同一個物件的引用。
物件池機制
為了提高效能,Java 在 1.5 以後針對八種基本型別的包裝類,提供了和 String 類一樣的物件池機制;
讓我們看一下 Integer.valueOf(int i) 的原始碼,就很容易理解了:
public final class Integer extends Number implements Comparable<Integer> {
static Integer valueOf(int i) {
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}
}
複製程式碼
- Integer.valueOf() 中有個內部類 IntegerCache,類似於一個常量陣列,也叫物件池,它維護了一個 Integer 陣列 cache,長度為(128+127+1)=256,意味著 Integer 快取池的大小預設為 -128 ~ 127 ;
- Integer類中還有一個靜態程式碼塊,預設建立了數值【-128-127】的 Integer 快取資料;所以當 Integer.valueOf(1) 的時候,會直接在該在物件池找到該值的引用;
- 在 jdk 1.8 中,在啟動 JVM 的時候,可以通過配置來指定這個緩衝池的大小。
Integer i = 1 與 Integer.valueOf(1)
Integer i = 1 ;
複製程式碼
等號左邊是 Integer 型別,等號右邊是 int 型別 ,這種寫法叫做裝箱(基本型別與其對應的包裝型別之間的賦值使用自動裝箱與拆箱完成),而裝箱操作是通過 Integer.valueOf(1) 完成的,所以:
Integer i = 1 等同於 Integer.valueOf(1)
其他基本型別對應的緩衝池
- Boolean:true,false
- Short,Int,Long:-128 ~ 127
- Byte,Character : \u0000 到 \u007F,也就是 0 ~ 127
會點程式碼的大叔 | 文【原創】