什么时候应该使用原语而不是包装对象?


问题内容

实际上,这是一个类似的话题,几乎没有实用价值。据我了解,原语性能更好,除需要与对象相关的功能(例如null检查)外,应在所有地方使用。对?


问题答案:

别忘了,由于为每次装箱而创建一个新的包装程序都是非常昂贵的,尤其是考虑到通常在一种方法的单个作用域中使用它,因此自动装箱将使用一组通用包装程序。

这实际上是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)