java - Boolean.TRUE 而不是 true 是自动装箱优化吗?

标签 java autoboxing

<分区>

我看到了下面的代码,想知道编码器的意图。与自动装箱的性能有关吗?

map.put("doesntMatter", Boolean.TRUE);

他本可以做到:

map.put("doesntMatter", true);

做第一个有什么好处?

最佳答案

我写了一个例子:

public class Demo {

    Map<String, Boolean> map = new HashMap<>();

    void primitive() {
        map.put("a", true);
    }

    void object() {
        map.put("b", Boolean.TRUE);
    }
}

primitive()的字节码

 0 aload_0
 1 getfield #17 <Demo/map Ljava/util/Map;>
 4 ldc #24 <a>
 6 iconst_1
 7 invokestatic #26 <java/lang/Boolean/valueOf(Z)Ljava/lang/Boolean;>
10 invokeinterface #32 <java/util/Map/put(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;> count 3
15 pop
16 return

object()

的字节码
 0 aload_0
 1 getfield #17 <Demo/map Ljava/util/Map;>
 4 ldc #39 <b>
 6 getstatic #41 <java/lang/Boolean/TRUE Ljava/lang/Boolean;>
 9 invokeinterface #32 <java/util/Map/put(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;> count 3
14 pop
15 return

结论:

当使用原语时,有一个调用 Boolean.valueOf() 的额外步骤,但如果您经常运行那段代码,JIT 编译器会完成它的工作并优化它。

关于java - Boolean.TRUE 而不是 true 是自动装箱优化吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17241869/

相关文章:

java - 捕获意外异常是一种好习惯吗?

java - 升级到Struts 2.3.32后出现404错误

java - java中字符串的自动装箱

java - 如何从 Cygwin 运行 Java

java - 无法访问 Maven 的 pom.xml 中设置的属性,System.getProperty 始终返回 null

java 无法保留一个实体,可能是因为 boolean 字段

java - 自动装箱是否调用 valueOf()?

java - 为什么人们仍然在 Java 中使用原始类型?

Java:自动装箱和强制转换有什么区别?

c# - 自动装箱和拆箱在 Java 和 C# 中的行为是否不同