以下代码编译(使用Java 8):
Integer i1 = 1000;
int i2 = 1000;
boolean compared = (i1 == i2);
但是它做了什么?
取消装箱i1
:
boolean compared = (i1.intvalue() == i2);
或框i2
:
boolean compared = (i1 == new Integer(i2));
那么它是按值比较两个Integer
个对象(通过引用)还是两个int
个变量?
请注意,对于某些数字,引用比较将产生正确的结果,因为Integer类维护的值在-128
到127
之间的内部缓存(另请参阅TheLostMind的注释)。这就是为什么我在我的例子中使用1000
以及为什么我特别询问拆箱/装箱而不是比较的结果。
答案 0 :(得分:48)
它在JLS #15.21.1:
中定义如果等于运算符的操作数都是数字类型,或者一个是数字类型而另一个是可转换的(第5.1.8节)是数字类型,则对操作数执行二进制数字提升(第5.6.2节) )。
当运算符将二进制数字提升应用于一对操作数时,每个操作数必须表示可转换为数字类型的值,以下规则适用:
- 如果任何操作数属于引用类型,则进行拆箱转换 [...]
为了回答您的问题,Integer
已取消装箱到int
。
答案 1 :(得分:35)
让我们举一些例子:
案例-1:
public static void main(String[] args) {
Integer i1 = 1000;
int i2 = 1000;
boolean compared = (i1 == i2);
System.out.println(compared);
}
字节代码:
....
16: if_icmpne 23 // comparing 2 integers
....
案例-2:
public static void main(String[] args) {
Integer i1 = 1000;
Integer i2 = 1000;
//int i2 = 1000;
boolean compared = (i1 == i2);
System.out.println(compared);
}
字节码:
...
16: if_acmpne 23 // comparing references
....
因此,如果将Integer
和int
与==
进行比较,Integer
将被取消装箱到int
,然后进行比较。
如果比较2 Integers
,则会比较2 Integers
的引用。
答案 2 :(得分:1)
<强>解释强>
使用== operator autoboxing比较两个原始值时 不会发生。
使用== operator autoboxing播放比较两个对象时 作用。
当使用混合组合时,它包含一个Object和 原始类型和比较是使用==运算符拆箱完成的 发生在对象上并转换为基本类型。
请仔细阅读以下链接,以便通过合适的示例了解有关自动装箱的详细信息。
参考链接:http://javarevisited.blogspot.in/2012/07/auto-boxing-and-unboxing-in-java-be.html