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