shm*_*sel 5 java autoboxing boxing
说我有以下代码:
Map<String, Boolean> map = ...
map.put("foo", true);
Run Code Online (Sandbox Code Playgroud)
从理论上讲,true必须进行自动装箱,与插入相比会导致轻微的性能损失Boolean.TRUE.但是由于我们正在处理一个文字值,编译器是否有可能用一个盒装文字替换原始文字,因此没有额外的运行时开销?
在任何人攻击我之前,我通常会为了代码清晰度而选择原始文字,即使性能成本很低.这个问题大多是理论上的.
是的,性能略有下降。为了装箱原语,valueOf()使用包装类型的方法。Boolean因为这是( )的一个简单方法return x ? TRUE : FALSE;,所以 JIT 可能能够有效地内联结果;然而,目前 Java 编译器还没有。valueOf()( JLS 不需要使用,因此Boolean可以引入 的优化。)
对于其他类型,则更为复杂。例如,Integer返回接近零的值的缓存实例,并为更大的值创建新实例。仍然可以执行优化,但分配新实例总是需要一些时间。
为了回应评论,让我重点关注我认为问题的关键点:
由于我们正在处理文字值,编译器是否可以将原始文字替换为装箱文字
是的,这是可能的,但是不行,Oraclejavac编译器不会这样做。
有关系吗?不,拳击对性能的影响Boolean是微乎其微的;对于编译器来说,boolean使用与其他原语相同的技术进行装箱是一个安全且明智的选择。valueOf()
| 归档时间: |
|
| 查看次数: |
810 次 |
| 最近记录: |