Java 当对原语和装箱值使用==时,是否完成了自动装箱或取消装箱

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

编译以下代码(使用Java 8):

但是它有什么作用呢

取消装箱
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作为我的例子,我将把它添加到问题中。有些相关: