别忘了,由于为每次装箱而创建一个新的包装程序都是非常昂贵的,尤其是考虑到通常在一种方法的单个作用域中使用它,因此自动装箱将使用一组通用包装程序。
这实际上是flyweight设计模式的一种实现。当对一个众所周知的值进行装箱时,而不是创建一个新的包装实例,而是从一个池中获取一个预先创建的实例并返回它。
结果是: 仍然不建议使用自动装箱进行科学计算 。例如,代码d = a * b +
c使用a,b,c和d的Integer类,并且生成的代码是d.valueOf(a.intValue() b.intValue()+ c.intValue(
))。所有这些方法调用都有其自身的开销,因此 通常建议在需要将原语存储在collection中时使用自动装箱* 。
即使这样,如果你有一个 巨大的集合 整数包装为int,带来的开销可能意味着较长的执行时间,高达 20倍的时间
,因为在这篇文章中报道。
Jb添加了以下重要评论:
Wrapper.valueOf(primitive)也使用包装池。因此,相对于新的Integer(5),更喜欢Integer.valueOf(5)



