盒装布尔值的等价

时间:2015-02-20 19:28:06

标签: java primitive autoboxing

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

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

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

你有什么想法?

2 个答案:

答案 0 :(得分:9)

来自Java Language Specification on Boxing Conversion

  

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

     
      
  • 从类型boolean到类型Boolean
  •   
     

[...]

     

如果框中的p值为,则为int类型的整数字面值   -128127包含(§3.10.1),或 boolean文字truefalse(§3.10.3),或'\u0000''\u007f'之间的字符文字   包容性(§3.10.4),然后让ab成为任意两个拳击的结果   p的转化。情况总是a == b

这相对简单implemented

/**
 * 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);
}

答案 1 :(得分:2)

是。编译器自动翻译:

Boolean b1 = true;

进入这个:

Boolean b1 = Boolean.valueOf(true);

始终返回两个常量之一Boolean.TRUEBoolean.FALSE