自动装箱是否调用 valueOf()?
我试图确定以下陈述是否保证为真:
((Boolean)true) == Boolean.TRUE
((Boolean)true) == Boolean.valueOf(true)
((Integer)1) == Integer.valueOf(1)
我一直认为自动装箱等同于调用相应的类型。我看到的关于这个话题的每一次讨论似乎都支持我的假设。但我在JLS中能找到的只是以下内容(§5.1.7):valueOf()
如果装箱的值是介于 和(§3.10.1) 之间的整数文本,或者是布尔文本或 (§3.10.3),或者介于 和 包含之间的字符文本 (§3.10.4),则让 和 成为 的任意两个装箱转换的结果。总是这样。
p
int
-128
127
true
false
'\u0000'
'\u007f'
a
b
p
a == b
这描述了与 的行为相同的行为。但是似乎没有任何保证实际被调用,这意味着理论上可能有一个实现,为自动装箱的值保留一个单独的专用缓存。在这种情况下,缓存的自动装箱值和常规缓存的装箱值之间可能没有标识相等性。valueOf()
valueOf()
Oracle 的自动装箱教程实际上指出,编译为 ,其中 是 .但我不知道本教程是否应该被视为权威来源。li.add(i)
li.add(Integer.valueOf(i))
i
int
*这是一个比 valueOf()
稍弱的保证,因为它仅指文字值。