以下代码编译(使用Java 8):
Integer i1 = 1000;
int i2 = 1000;
boolean compared = (i1 == i2);
Run Code Online (Sandbox Code Playgroud)
但是它做了什么?
取消框i1:
boolean compared = (i1.intvalue() == i2);
Run Code Online (Sandbox Code Playgroud)
或盒子i2:
boolean compared = (i1 == new Integer(i2));
Run Code Online (Sandbox Code Playgroud)
那么它是按比例比较两个Integer对象(通过引用)还是两个int变量?
请注意,对于某些数字,因为Integer类维护值之间的内部缓存中的基准比较将产生正确的结果-128来127(见也TheLostMind注释).这就是我1000在我的例子中使用的原因以及为什么我特别询问拆箱/装箱而不是比较的结果.
ass*_*ias 51
它在JLS#15.21.1中定义:
如果等于运算符的操作数都是数字类型,或者一个是数字类型而另一个是可转换的(第5.1.8节)为数字类型,则对操作数执行二进制数字提升(第5.6.2节).
当运算符将二进制数字提升应用于一对操作数时,每个操作数必须表示可转换为数字类型的值,以下规则适用,顺序如下:
- 如果任何操作数是引用类型,则进行拆箱转换[...]
所以要回答你的问题,将Integer其拆箱成一个int.
The*_*ind 37
让我们举一些例子:
情况1 :
public static void main(String[] args) {
Integer i1 = 1000;
int i2 = 1000;
boolean compared = (i1 == i2);
System.out.println(compared);
}
Run Code Online (Sandbox Code Playgroud)
字节代码:
....
16: if_icmpne 23 // comparing 2 integers
....
Run Code Online (Sandbox Code Playgroud)
案例-2:
public static void main(String[] args) {
Integer i1 = 1000;
Integer i2 = 1000;
//int i2 = 1000;
boolean compared = (i1 == i2);
System.out.println(compared);
}
Run Code Online (Sandbox Code Playgroud)
字节码:
...
16: if_acmpne 23 // comparing references
....
Run Code Online (Sandbox Code Playgroud)
因此,如果比较Integer和将int其==与Integer未装箱进行int比较,则会发生比较.
在比较2的情况下,比较2 Integers的参考Integers.
解释
当使用 == 运算符比较两个原始值时,不会发生自动装箱。
当使用 == 运算符比较两个对象时,自动装箱发挥作用。
当使用混合组合时,它包含一个对象和原始类型,并使用 == 运算符进行比较,在对象上发生拆箱并转换为原始类型。
请浏览以下链接,它将帮助您通过合适的示例详细了解自动装箱。
参考链接:http://javarevisited.blogspot.in/2012/07/auto-boxing-and-unboxing-in-java-be.html