比较整数对象

Luk*_*lor 31 java oop object

我有以下代码:

public class Test {

    public static void main(String[] args) {

        Integer alpha = new Integer(1);
        Integer foo = new Integer(1);

        if(alpha == foo) {
            System.out.println("1. true");
        }

        if(alpha.equals(foo)) {
            System.out.println("2. true");
        }

    } 

}
Run Code Online (Sandbox Code Playgroud)

输出如下:

2. true
Run Code Online (Sandbox Code Playgroud)

但是,更改Integer objectto 的类型int将产生不同的输出,例如:

public class Test {

    public static void main(String[] args) {

        Integer alpha = new Integer(1);
        int foo = 1;

        if(alpha == foo) {
            System.out.println("1. true");
        }

        if(alpha.equals(foo)) {
            System.out.println("2. true");
        }

    } 

}
Run Code Online (Sandbox Code Playgroud)

新输出:

1. true
2. true
Run Code Online (Sandbox Code Playgroud)

怎么会这样呢?为什么第一个示例代码没有输出1. true

mer*_*ike 34

对于引用类型,==检查引用是否相等,即它们是否指向同一对象.

对于基本类型,==检查值是否相等.

java.lang.Integer是一种参考类型.int是一种原始类型.

编辑:如果一个操作数是基本类型,而另一个操作数是打开合适的基元类型,==则会比较值,而不是引用.

  • 问答+1.只是为了确保:在情况`(Integer == int)`或`(int == Integer)`它总是被取消装箱到`(int == int)`不自动装箱到`(Integer == Integer)`? (6认同)

Hid*_*dde 7

整数对象是对象.这听起来合乎逻辑,但却是问题的答案.对象使用new关键字在Java中生成,然后存储在内存中.比较时,比较对象的内存位置,而不是对象的值/属性.

使用该.equals()方法,您实际上比较了对象的值/属性,而不是它们在内存中的位置:

new Integer(1) == new Integer(1)返回 false,同时new Integer(1).equals(new Integer(1))返回true.


ints是java的原始类型.创建int时,引用的所有内容都是值.当您比较Java中的任何基本类型时,所有比较的是值,而不是内存位置.这就是为什么5 == 5总是返回true.

Integer对象与基本类型进行比较时,如果可能,将对象强制转换为基本类型.使用a Integer和a int这是可能的,因此将它们进行比较.这就是为什么Integer(1).equals(1)返回true.