陷阱 - 使用 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 语言规范强制要求整数类型的缓存行为。