java中允许整数== int
我想知道在与 int 比较时,java 是否会自动将 Integer 转换为 int ?或者 == 会尝试比较原语的引用吗?
这总是正确的还是我需要执行i.intValue()==2
?
Integer i = Integer.valueOf(2);
if (i==2){
//always?
}
I was wondering if java automatically turns a Integer into an int when comparing to an int? Or will the == try and compare references on primitives?
Is this always true or do I need to do i.intValue()==2
?
Integer i = Integer.valueOf(2);
if (i==2){
//always?
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(6)
是的,当使用
==
比较int
时,如有必要,参数将被拆箱。Java 语言规范中的相关部分:
同样适用于
<
、<=
、>
、>=
等,以及 <代码>+、<代码>-、<代码>*等。因此,
打印
true
:-)对,实际上也有类似的情况
整数
也是如此。装箱时(将
int
转换为Integer
),编译器对小值 (-128 - 127) 使用缓存,并对相同值重用相同对象,因此可能有点令人惊讶的是,我们有以下内容:Yes, when comparing
int
using==
arguments will be unboxed if necessary.Relevant section from the Java Language Specification:
Same applies for
<
,<=
,>
,>=
etc, as well as+
,-
,*
and so on.So,
prints
true
:-)Right, and there is actually a similar situation for
Integers
as well.When boxing (transforming
int
toInteger
) the compiler uses a cache for small values (-128 - 127) and reuses the same objects for the same values, so perhaps a bit surprising, we have the following:是的,它将拆箱。 第 15.21 节对此进行了介绍JLS .1(数字 == 运算符):
(我已经链接了第 5.1.8 节,因为这就是关于从
Integer
到int
的转换可用的内容。)Yes, it will unbox. This is covered in section 15.21.1 of the JLS (the numeric == operator):
(I've linkified section 5.1.8 as that's what talks about the conversion from
Integer
toint
being available.)这是可能的。
该 Java 功能称为“自动装箱”。
This is possible.
That Java-feature is called Autoboxing.
是的,它会自动转换。
你也可以做
yes, it's automatically converted.
you can also do
是的,这有效,因为自动(取消)装箱。
Yes this works because auto (un)boxing.
它将比较基元 -
Integer
将被拆箱。但根据经验:避免这种情况。总是更喜欢基元,并且在将对象与==
进行比较时要小心,除了 在 JLS 中看到这一点,您可以通过以下方式验证这一点:
不要使用使用缓存的
Integer.valueOf(2)
,而是使用新整数(2)
。这保证是一个与装箱时2
所获得的实例不同的实例(装箱发生在Integer.valueOf(..)
中)。在这种情况下,条件仍然为真,这意味着比较的不是引用。It will compare primitives - the
Integer
will be unboxed. But as a rule of thumb: avoid that. Always prefer primitives, and be careful when comparing objects with==
Apart from seeing this in the JLS, here's how you can verify that:
Instead of
Integer.valueOf(2)
, which uses a cache, usenew Integer(2)
. This is guaranteed to be a different instance than the one that will be obtained if2
if boxed (the boxing happens withInteger.valueOf(..)
). In this case, the condition is still true, which means that it's not references that are compared.