autobox原始文字是否有性能成本?

shm*_*sel 5 java autoboxing boxing

说我有以下代码:

Map<String, Boolean> map = ...
map.put("foo", true);
Run Code Online (Sandbox Code Playgroud)

从理论上讲,true必须进行自动装箱,与插入相比会导致轻微的性能损失Boolean.TRUE.但是由于我们正在处理一个文字值,编译器是否有可能用一个盒装文字替换原始文字,因此没有额外的运行时开销?

在任何人攻击我之前,我通常会为了代码清晰度而选择原始文字,即使性能成本很低.这个问题大多是理论上的.

eri*_*son 4

是的,性能略有下降。为了装箱原语,valueOf()使用包装类型的方法。Boolean因为这是( )的一个简单方法return x ? TRUE : FALSE;,所以 JIT 可能能够有效地内联结果;然而,目前 Java 编译器还没有。valueOf()( JLS 不需要使用,因此Boolean可以引入 的优化。)

对于其他类型,则更为复杂。例如,Integer返回接近零的值的缓存实例,并为更大的值创建新实例。仍然可以执行优化,但分配新实例总是需要一些时间。


为了回应评论,让我重点关注我认为问题的关键点:

由于我们正在处理文字值,编译器是否可以将原始文字替换为装箱文字

是的,这是可能的,但是不行,Oraclejavac编译器不会这样做。

有关系吗?不,拳击对性能的影响Boolean是微乎其微的;对于编译器来说,boolean使用与其他原语相同的技术进行装箱是一个安全且明智的选择。valueOf()

  • 我认为关键点是,每当必须分配“新对象”时,就会出现主要的性能影响。对于 Boolean.valueOf() 来说,永远不会分配新对象。代码确实应该使用类常量 Boolean.TRUE,而不是布尔原始文字,但我希望在这种情况下两者之间的实际性能差异非常小, (4认同)