java中允许的Integer == int

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

这总是正确的还是我需要做i.intValue()==2

 Integer i = Integer.valueOf(2); if (i==2){ //always? } 

是的,比较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); 

打印true 🙂

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

是的, Integers也有类似的情况。

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

 System.out.println(Integer.valueOf(100) == Integer.valueOf(100)); // prints true System.out.println(Integer.valueOf(200) == Integer.valueOf(200)); // prints false 

是的,它将取消装箱。 这在JLS的第15.21.1节 (数字==运算符)中有所介绍 :

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

请注意,二进制数字提升执行值集转换(第5.1.13节)和拆箱转换(第5.1.8节 )。

(我已经将第5.1.8节链接起来了,因为这是关于从Integerint的转换的说法。)

这个有可能。

Javafunction称为Autoboxing 。

是的,它会自动转换。 你也可以

 Integer i = 2; 

是的这是因为自动(联合国)拳击。

它将比较原语 – Integer将被取消装箱。 但作为一个经验法则:避免这样做。 总是更喜欢基元,并且在将对象与==进行比较时要小心

除了在JLS中看到这个 ,这里是你如何validation:

而不是使用缓存的Integer.valueOf(2) ,使用new Integer(2) 。 这保证是一个不同于将获得的实例,如果为2如果装箱(拳击发生在Integer.valueOf(..) )。 在这种情况下,条件仍然是真的,这意味着它不是被比较的引用。