何时应使用基元而不是包装对象?

2022-09-03 09:19:46

实际上,这是一个类似的主题,几乎没有实际价值。据我所知,基元性能更好,应该在任何地方使用,除了与对象相关的功能(例如 检查)是必需的。右?null


答案 1

不要忘记,由于为每个装箱事件创建新的包装器非常昂贵,特别是考虑到它通常在方法的单个范围内使用,因此自动装箱使用一个常见包装器池。

这实际上是蝇量级设计模式的实现。当对已知值进行装箱时,将从池中提取预创建的实例并返回,而不是创建新的包装器实例。

一个后果是:仍然不建议使用自动装箱进行科学计算。例如,代码 d = a * b + c 对 a、b、c 和 d 使用 Integer 类,生成的代码是 d.valueOf(a.intValue() * b.intValue() + c.intValue())。所有这些方法调用都有自己的开销,因此通常建议在需要时使用自动装箱以将基元存储在集合中

即便如此,如果您有一个巨大的整数包装 int 集合,则开销可能意味着更长的执行时间,最多可以延长 20 倍,如本文所述


Jb补充了以下重要评论:

此外,Wrapper.valueOf(primitive) 使用包装池。所以更喜欢 Integer.valueOf(5) 而不是新的 Integer(5)


答案 2

使用基元时速度更快,因为对象在使用前需要拆箱;因此,VM 需要执行一个额外的步骤。例如,为了对整数执行算术运算,必须先将其转换为 int,然后才能执行算术运算。

在许多业务应用程序中,这可能很少重要。但是,如果你正在写一些非常繁琐的东西,比如说,图形转换处理器,你更有可能关心。