快速提问:是否可以保证此代码始终打印true
?
Boolean b1 = true;
Boolean b2 = true;
System.out.println(b1 == b2);
布尔值的装箱似乎总是导致相同的布尔对象,但我找不到太多关于JLS中的盒装布尔相等的信息。相反,它甚至似乎暗示拳击应该创建新对象,甚至可能导致OOM异常。
你有什么想法?
答案 0 :(得分:9)
来自Java Language Specification on Boxing Conversion
拳击转换将基本类型的表达式转换为 相应的引用类型表达式。具体来说, 以下九次转换被称为拳击转换:
- 从类型
boolean
到类型Boolean
[...]
如果框中的
p
值为,则为int
类型的整数字面值-128
和127
包含(§3.10.1),或boolean
文字true
或false
(§3.10.3),或'\u0000'
和'\u007f'
之间的字符文字 包容性(§3.10.4),然后让a
和b
成为任意两个拳击的结果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.TRUE
或Boolean.FALSE
。