No, == Integer, Long etc将检查引用是否相等。
Integer x = ...;
Integer y = ...;
System.out.println(x == y);
这将检查x和y是否指向相同的对象,而不是相同的对象。
So
Integer x = new Integer(10);
Integer y = new Integer(10);
System.out.println(x == y);
保证打印为false。“小”自动装箱值的实习可能会导致棘手的结果:
Integer x = 10;
Integer y = 10;
System.out.println(x == y);
根据装箱规则(JLS第5.1.7节),这将输出true。它仍然使用了引用相等,但是引用实际上是相等的。
如果被装箱的值p是一个int类型的整型字面值
-128和127包括(§3.10.1),或布尔字面值真或假(§3.10.3),或'\u0000'和'\u007f'之间的字符字面值
包含(§3.10.4),则设a和b是任意两个装箱的结果
a == b总是成立的。
我个人会使用:
if (x.intValue() == y.intValue())
or
if (x.equals(y))
正如您所说,对于包装器类型(Integer, Long等)和数字类型(int, Long等)之间的任何比较,包装器类型值将被打开,测试将应用于涉及的原语值。
这是二进制数字提升的一部分(JLS第5.6.2节)。查看每个操作符的文档,看看它是否适用。例如,从文档For ==和!= (JLS 15.21.1):
如果一个等式的操作数
运算符都是数值类型或
一个是数字类型,另一个是数字类型
是否可转换(§5.1.8)为数字
类型,二进制数字提升是
在操作数上执行(§5.6.2)。
and <, <=, > and >= (JLS 15.20.1)
a的每个操作数的类型
数值比较运算符必须是
可转换(§5.1.8)的类型
基元数字类型
发生编译时错误。二进制
上执行数字提升
操作数(§5.6.2)。如果升职了
操作数的类型是int或long,
那么有符号整数比较是
执行;如果此提升类型为
Float或double,然后是浮点数
进行比较。
请注意,在两种类型都不是数字类型的情况下,这些都不会被认为是情况的一部分。