布尔值会自动装箱到同一个实例吗?

Mic*_*uff 2 java autoboxing

布尔值会自动装箱到同一个实例吗?

我有一个小测试表明确实如此,但我不会对此下任何赌注。有保证吗?

    @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 范围之外的整数。

Ste*_*n C 5

对于 Java 11 1JLS 5.1.7指出:

\n
\n

在运行时,装箱转换按如下方式进行:

\n
    \n
  • 如果 p 是 boolean 类型的值,则装箱转换会将 p 转换为类和 Boolean 类型的引用 r,使得 r.booleanValue() == p
  • \n
\n

[...]

\n

如果被装箱的值 p是计算常量表达式的结果 (\xc2\xa715.28),并且结果为 true、false、范围 \' 中的字符\\u0000\' 到 \'\\u007f\'(含),或 -128 到 127(含)范围内的整数,然后令 a 和 b 为 p 的任意两次装箱转换的结果。a == b 的情况总是如此。

\n
\n

JLS 没有明确声明该<wrapperType>::valueOf方法用于自动装箱。实际上,Java 编译器通常确实以这种方式实现它,但它是一个实现细节,并且可以(理论上)

\n

所以...除了“常量表达式”情况...您不应该依赖与Boolean.TRUEBoolean.FALSE对象引用2相同的自动装箱布尔值相同的自动装箱布尔值。

\n
\n

1 - JLS 的早期版本对拳击做出了更强有力的声明。但这显然是对规范的故意更改。

\n

2 - 您的应用程序可以采取措施使用(或其他方式)手动装箱布尔值。Boolean::valueOf但那是不同的情况。可能不推荐,因为您必须确保始终如一地这样做。

\n