布尔值的相等性

3

一个快速的问题:这段代码是否保证总是打印true

Boolean b1 = true;
Boolean b2 = true;
System.out.println(b1 == b2);

布尔类型的装箱似乎总是导致相同的布尔对象,但我在JLS中没有找到太多关于装箱布尔相等性的信息。相反,它甚至似乎暗示装箱应该创建新对象,甚至可能导致OOM异常。
你有什么想法?

2
new Boolean(true) 不会等于其他装箱的布尔值。 - Louis Wasserman
2个回答

10

Java语言规范的装箱转换章节

装箱转换将原始类型表达式转换为相应的引用类型表达式。具体来说,以下九个转换称为装箱转换:

  • 从类型boolean到类型Boolean

[...]

如果被装箱的值pint类型的整数字面量,介于-128127之间(§3.10.1),或boolean字面量truefalse(§3.10.3),或介于'\u0000''\u007f'之间的字符字面量(§3.10.4),那么让ab分别成为p的两个装箱转换的结果,则总是有a == b

这在实现上相对简单,如下:

/**
 * The {@code Boolean} object corresponding to the primitive
 * value {@code true}.
 */
public static final Boolean TRUE = new Boolean(true);

/**
 * The {@code Boolean} object corresponding to the primitive
 * value {@code false}.
 */
public static final Boolean FALSE = new Boolean(false);

public static Boolean valueOf(boolean b) {
    return (b ? TRUE : FALSE);
}

谢谢,我忽略了那一部分。 - Oleg Mikheev
但我猜Boolean.TRUE == true不能保证是正确的,对吧? - Oleg Mikheev
2
@OlegMikheev 是的,可以看看JLS 15.21.2。在这种情况下,Boolean.TRUE被拆箱为true,因此您会得到true == true - Jesper

2

是的。编译器会自动将此内容翻译为:

Boolean b1 = true;

转换为以下内容:

Boolean b1 = Boolean.valueOf(true);

这个方法总是返回两个常量之一,Boolean.TRUEBoolean.FALSE


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接