布尔值会自动装箱到同一个实例吗?
我有一个小测试表明确实如此,但我不会对此下任何赌注。有保证吗?
@Test
public void autoboxBooleans() {
Multimap<Boolean, Integer> ids = HashMultimap.create();
for (int i = 0; i < 10; i++) {
Boolean rand = ThreadLocalRandom.current().nextBoolean();
ids.put(rand, System.identityHashCode(rand));
}
System.out.println(ids); // {false=[453523494], true=[2024918163]}
}
Run Code Online (Sandbox Code Playgroud)
注意:这个问题讨论的是 0-127 范围之外的整数。
对于 Java 11 1,JLS 5.1.7指出:
\n\n\n在运行时,装箱转换按如下方式进行:
\n\n
\n- 如果 p 是 boolean 类型的值,则装箱转换会将 p 转换为类和 Boolean 类型的引用 r,使得 r.booleanValue() == p
\n[...]
\n如果被装箱的值 p是计算常量表达式的结果 (\xc2\xa715.28),并且结果为 true、false、范围 \' 中的字符\\u0000\' 到 \'\\u007f\'(含),或 -128 到 127(含)范围内的整数,然后令 a 和 b 为 p 的任意两次装箱转换的结果。a == b 的情况总是如此。
\n
JLS 没有明确声明该<wrapperType>::valueOf方法用于自动装箱。实际上,Java 编译器通常确实以这种方式实现它,但它是一个实现细节,并且可以(理论上)
所以...除了“常量表达式”情况...您不应该依赖与Boolean.TRUE或Boolean.FALSE对象引用2相同的自动装箱布尔值相同的自动装箱布尔值。
1 - JLS 的早期版本对拳击做出了更强有力的声明。但这显然是对规范的故意更改。
\n2 - 您的应用程序可以采取措施使用(或其他方式)手动装箱布尔值。Boolean::valueOf但那是不同的情况。可能不推荐,因为您必须确保始终如一地这样做。