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节链接起来了,因为这是关于从Integer
到int
的转换的说法。)
这个有可能。
Javafunction称为Autoboxing 。
是的,它会自动转换。 你也可以
Integer i = 2;
是的这是因为自动(联合国)拳击。
它将比较原语 – Integer
将被取消装箱。 但作为一个经验法则:避免这样做。 总是更喜欢基元,并且在将对象与==
进行比较时要小心
除了在JLS中看到这个 ,这里是你如何validation:
而不是使用缓存的Integer.valueOf(2)
,使用new Integer(2)
。 这保证是一个不同于将获得的实例,如果为2
如果装箱(拳击发生在Integer.valueOf(..)
)。 在这种情况下,条件仍然是真的,这意味着它不是被比较的引用。