因为在Java中,泛型通常在幕后操作Object,所以我很好奇嵌入这样的值是否会比放置一个已经存在的对象产生更多的开销.

考虑一下可以包含任意元信息的Map<String, Object>.您想要在那里放置一个类似于标记的条目-如果它存在,则该标记被启用.

所以你有这样的东西:

static final String MY_FLAG_NAME = "name";
Map<String, Object> myMap;

现在我想知道这三种设置单位的实现是否有区别:

  1. myMap.put(MY_FLAG_NAME, true)(false表示禁用)
  2. myMap.put(MY_FLAG_NAME, null)(我们可以使用containsKey,但在我看来这看起来很脏)
  3. myMap.put(MY_FLAG_NAME, MY_FLAG_NAME)(字符串已经分配,可以用""表示禁用)

我这里的问题是,这是否会在某个时候迫使引擎盖下某种形式的new Boolean(),或者如果我把一个字符串或布尔值都无关紧要.我从来没有真正理解过Java如何准确地处理泛型中boolean/Boolean的差异,其他原语类型也是如此.

这段代码会被多次调用,但我没有足够的Java知识来进行可靠的性能测试.

推荐答案

装箱常量boolean(与文字truefalse一样)不会创建任意多个新对象.这Java Language Specification人说:

如果被装箱的值p是计算类型为boolean的常量表达式(§15.29)[...]的结果,并且结果是true,false,[...],则令abp的任意两个装箱转换的结果.情况总是这样的.

如果它不是常量布尔表达式(例如someString.length() == 5),则语言规范不能保证装箱生成相同的对象,但我认为任何合理的实现都会将布尔装箱实现为调用Boolean.valueof(boolean),这不会创建任意多个新的Boolean对象.它只返回静态的最终字段Boolean.TRUEBoolean.FALSE.当然,在初始化TRUEFALSE字段时将创建新的Boolean对象,但如果只使用Boolean.valueOf,则不会创建其他Boolean对象.

返回表示指定布尔值的Boolean实例.如果指定的布尔值为true,则此方法返回Boolean.TRUE;如果为false,则此方法返回Boolean.FALSE.

Java相关问答推荐

伪类focus-in不适用于PFA中的选项卡

Quarkus keycloat配置不工作.quarkus. keycloak. policy—enforcer. enable = true在. yaml表示中不工作

为什么BasicComboBoxRenderer在文本不存在或文本为空的情况下设置两次文本?

为什么我要创建一个单独的互斥体/锁对象?

Exe4j创建的应用程序无法再固定在任务栏Windows 11上

我找不到&Quot;配置&的位置

如何调整工作时间日历中的时间

使用Spring Boot3.2和虚拟线程的并行服务调用

Spring data JPA/Hibernate根据id获取一个列值

在Spring Boot中使用哪个Java类来存储创建时间戳?

为什么Java编译器不区分不同类型的方法?

第三方Jar pom.xml

Java创建带有扩展通配符的抽象处理器

一对多关系和ID生成

如何在盒子的顶部和底部创建两张不同图片(大小相同)的盒子?

从Spring6中的JPMS模块读取类时出现问题

Java 17与Java 8双重表示法

具有多个分析模式的复杂分隔字符串的正则表达式

[jdk21][Foreign Function&;Memory API]MemoryLayout::varHandle通过可变数组进行 struct 化的问题

spring 数据Elastic search 与 spring 启动数据Elastic search 之间的区别是什么?