陷阱 - 使用 new 來建立原始包裝器例項是低效的

Java 語言允許你使用 new 建立例項 IntegerBoolean 等,但這通常是一個壞主意。最好使用自動裝箱(Java 5 及更高版本)或 valueOf 方法。

 Integer i1 = new Integer(1);      // BAD
 Integer i2 = 2;                   // BEST (autoboxing)
 Integer i3 = Integer.valueOf(3);  // OK

明確使用 new Integer(int) 的原因是它建立了一個新物件(除非由 JIT 編譯器優化)。相反,當使用自動裝箱或顯式 valueOf 呼叫時,Java 執行時將嘗試從預先存在的物件的快取中重用 Integer 物件。每次執行時都有一個命中快取,它就避免了建立一個物件。這也節省了堆記憶體並減少了由物件流失引起的 GC 開銷。

筆記:

  1. 在最近的 Java 實現中,通過呼叫 valueOf 實現了自動裝箱,並且有 BooleanByteShortIntegerLongCharacter 的快取。
  2. Java 語言規範強制要求整數型別的快取行為。