2011-10-06 70 views
3

我在想如果java比较int时自动将Integer变成int吗?或者将==尝试并比较基元上的引用?Integer == int允许在java中

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

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

当你运行它时会看到什么? –

+0

是的,运行的作品,但你可以用==比较两个相等的字符串,有时会根据字符串的集合方式得到真或假... –

+1

这是一个称为[autoboxing] [1]的特性,已经在Java 1.5 。 [1]:http://stackoverflow.com/questions/166340/write-a-password-protected-zip-file-in-java – michael667

回答

10

是,使用==参数如有必要,将拆箱比较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的类似情况。

当拳击(转化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 
1

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

4

是的,它会取消装箱。这在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可用。)

1

它会比较原语 - 在Integer会拆箱。但根据经验:避免这种情况。总是喜欢原语,并与==

除了seeing this in the JLS比较对象时要小心,这里是你如何验证:

相反的Integer.valueOf(2),它采用了高速缓存,使用new Integer(2)。这是保证是一个不同的实例,如果盒装2将获得一个不同的实例(拳击发生在Integer.valueOf(..))。在这种情况下,条件仍然是正确的,这意味着它不是被比较的参考。

2

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

Integer i = 2;