陷阱 - 使用 new 來建立原始包裝器例項是低效的
Java 語言允許你使用 new
建立例項 Integer
,Boolean
等,但這通常是一個壞主意。最好使用自動裝箱(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 開銷。
筆記:
- 在最近的 Java 實現中,通過呼叫
valueOf
實現了自動裝箱,並且有Boolean
,Byte
,Short
,Integer
,Long
和Character
的快取。 - Java 語言規範強制要求整數型別的快取行為。