java中允许的Integer == int

Fra*_*fka 5 java int equals

我想知道java与int比较时是否自动将Integer转换为int?或者==尝试并比较原语的引用?

这是真的还是我需要做的i.intValue()==2

Integer i = Integer.valueOf(2);
if (i==2){
//always?
}
Run Code Online (Sandbox Code Playgroud)

aio*_*obe 11

是的,当比较int使用==参数时,如果需要,将取消装箱.

Java语言规范的相关部分:

15.21.1数值等式算子==和!=

如果等于运算符的操作数都是数字类型,或者一个是数字类型而另一个是可转换的(第5.1.8节)为数字类型,则对操作数执行二进制数字提升(第5.6.2节).如果提升类型的操作数是int或long,则执行整数相等测试; 如果提升的类型是float或double,则执行浮点相等性测试.

请注意,二进制数字促销执行值集转换(第5.1.13节)和拆箱转换(第5.1.8节).对浮点值进行精确比较,无论它们的代表值是从哪个值集中得出.

同样适用于<,<=,>,>=等,以及+,-,*等等.

所以,

System.out.println(Integer.valueOf(17) == 17);
Run Code Online (Sandbox Code Playgroud)

打印true:-)

但你可以比较两个相等的字符串与==有时得到真或假,取决于字符串的汇总方式...

是的,实际上也存在类似的情况Integers.

当装箱(转换intInteger)时,编译器使用缓存来获取较小的值(-128-127)并为相同的值重用相同的对象,因此可能有点令人惊讶,我们有以下内容:

System.out.println(Integer.valueOf(100) == Integer.valueOf(100)); // prints true
System.out.println(Integer.valueOf(200) == Integer.valueOf(200)); // prints false
Run Code Online (Sandbox Code Playgroud)


Jon*_*eet 5

是的,它将拆箱。JLS 的第 15.21.1 节(数字 == 运算符)对此进行了介绍:

\n
\n

如果等式运算符的操作数均为数字类型,或者一个为数字类型,另一个可转换(\xc2\xa75.1.8)为数字类型,则对操作数( \xc2\xa75.1.8 )执行二进制数字提升。 6.2)。如果操作数的提升类型为 int 或 long,则执行整数相等测试;如果提升的类型是 float 或 double,则执行浮点相等测试。

\n

请注意,二进制数字提升执行值集转换 (\xc2\xa75.1.13) 和拆箱转换 ( \xc2\xa75.1.8 )。

\n
\n

(我已经链接了第 5.1.8 节,因为这就是关于从可用Integerint可用的转换的内容。)

\n