盒装布尔值的等价

Ole*_*eev 3 java primitive autoboxing

快速提问:是否保证此代码始终打印true

Boolean b1 = true;
Boolean b2 = true;
System.out.println(b1 == b2);
Run Code Online (Sandbox Code Playgroud)

拳击布尔似乎总是导致相同的布尔对象,但我找不到太多关于JLS中的盒装布尔相等的信息.相反,它甚至似乎暗示拳击应该创建新对象,甚至可能导致OOM异常.

你的想法是什么?

Sot*_*lis 9

拳击转换Java语言规范

拳击转换将基本类型的表达式转换为引用类型的相应表达式.具体来说,以下九个转换称为装箱转换:

  • 从类型boolean到类型Boolean

[...]

如果该值p被装箱是一个整数文字类型的int之间 -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);
}
Run Code Online (Sandbox Code Playgroud)

  • @OlegMikheev是的,见[JLS 15.21.2](http://docs.oracle.com/javase/specs/jls/se8/html/jls-15.html#jls-15.21.2).在这种情况下,`Boolean.TRUE`被取消装箱到'true`,所以你得到'true == true`. (2认同)