Java 当对原语和装箱值使用==时,是否完成了自动装箱或取消装箱
编译以下代码(使用Java 8): 但是它有什么作用呢 取消装箱Java 当对原语和装箱值使用==时,是否完成了自动装箱或取消装箱,java,autoboxing,Java,Autoboxing,编译以下代码(使用Java 8): 但是它有什么作用呢 取消装箱i1: boolean compared = (i1.intvalue() == i2); 或框i2: boolean compared = (i1 == new Integer(i2)); 那么它是通过引用比较两个Integer对象还是通过值比较两个int变量 请注意,对于某些数字,引用比较将产生正确的结果,因为Integer类维护-128到127之间的值的内部缓存(另请参见LostMind的注释)。这就是我在示例中使用100
i1
:
boolean compared = (i1.intvalue() == i2);
或框i2
:
boolean compared = (i1 == new Integer(i2));
那么它是通过引用比较两个Integer
对象还是通过值比较两个int
变量
请注意,对于某些数字,引用比较将产生正确的结果,因为Integer类维护
-128
到127
之间的值的内部缓存(另请参见LostMind的注释)。这就是我在示例中使用1000
的原因,也是我特别询问取消装箱/装箱而不是比较结果的原因。让我们做一些示例:
案例-1:
public static void main(String[] args) {
Integer i1 = 1000;
int i2 = 1000;
boolean compared = (i1 == i2);
System.out.println(compared);
}
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_icmpne 23 // comparing 2 integers
....
案例-2:
public static void main(String[] args) {
Integer i1 = 1000;
int i2 = 1000;
boolean compared = (i1 == i2);
System.out.println(compared);
}
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
....
因此,在将整数
和int
与=
进行比较的情况下,整数
被取消绑定到int
,然后进行比较
如果比较2个整数
,则比较2个整数
的引用。定义如下:
如果相等运算符的操作数都是数字类型,或者一个是数字类型,另一个可转换为数字类型(§5.1.8),则对操作数(§5.6.2)执行二进制数字提升
以及:
当运算符将二进制数字提升应用于一对操作数(每个操作数必须表示可转换为数字类型的值)时,以下规则依次适用:
- 如果任何操作数属于引用类型,则将对其进行取消装箱转换 [……]
因此,为了回答您的问题,将
整数
解压为int
解释
参考链接:当然,如果您运行此代码并打印输出,您可以自己确定。问题与用于将其标记为重复的问题不完全相同:)@Scruffy-没有那么简单<代码>整数类维护介于
-128到127之间的值的内部缓存。因此,即使您使用=
将整数i1=100
与整数i2=100
进行比较,您也会得到true
。当i1
和i2
都不在本地缓存中时,您将得到false
range@TheLostMind,说得好。这就是为什么我选择1000作为我的例子,我将把它添加到问题中。有些相关: