我在想如果java比较int时自动将Integer变成int吗?或者将==尝试并比较基元上的引用?Integer == int允许在java中
这是总是对的还是我需要做i.intValue()==2
?
Integer i = Integer.valueOf(2);
if (i==2){
//always?
}
我在想如果java比较int时自动将Integer变成int吗?或者将==尝试并比较基元上的引用?Integer == int允许在java中
这是总是对的还是我需要做i.intValue()==2
?
Integer i = Integer.valueOf(2);
if (i==2){
//always?
}
是,使用==
参数如有必要,将拆箱比较int
时。从Java Language Specification
有关章节:
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
:-)
,但你可以根据字符串是如何汇集用==比较两个字符串相等,有时得到真或FALS。 ..
对,那里实际上也是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
这是可能的。
Java特征被称为Autoboxing。
是的,这是可行的,因为自动(联合国)拳击。
是的,它会取消装箱。这在section 15.21.1 of the JLS(数字==操作者)所覆盖:
如果相等运算符的操作数都是数字型的,或一个是数字型的,另一种是可兑换(§5.1.8)到数字类型,对操作数执行二进制数字提升(第5.6.2节)。如果提升类型的操作数是int或long,则执行整数相等性测试;如果升级类型为float或double,则执行浮点相等性测试。
请注意,二进制数字提升执行值集转换(§5.1.13)和拆箱转换(§5.1.8)。
(我linkified部分5.1.8因为这是关于从Integer
转换什么会谈int
可用。)
它会比较原语 - 在Integer
会拆箱。但根据经验:避免这种情况。总是喜欢原语,并与==
除了seeing this in the JLS比较对象时要小心,这里是你如何验证:
相反的Integer.valueOf(2)
,它采用了高速缓存,使用new Integer(2)
。这是保证是一个不同的实例,如果盒装2
将获得一个不同的实例(拳击发生在Integer.valueOf(..)
)。在这种情况下,条件仍然是正确的,这意味着它不是被比较的参考。
是的,它会自动转换。 你也可以做
Integer i = 2;
当你运行它时会看到什么? –
是的,运行的作品,但你可以用==比较两个相等的字符串,有时会根据字符串的集合方式得到真或假... –
这是一个称为[autoboxing] [1]的特性,已经在Java 1.5 。 [1]:http://stackoverflow.com/questions/166340/write-a-password-protected-zip-file-in-java – michael667