比较整数对象

2022-09-01 10:41:14

我有以下代码:

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");
        }

    } 

}

输出如下:

2. true

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

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");
        }

    } 

}

新输出:

1. true
2. true

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


答案 1

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

对于基元类型,检查值是否相等。==

java.lang.Integer是一种引用类型。 是基元类型。int

编辑:如果一个操作数是基元类型,而另一个操作数是取消装箱到合适基元类型的引用类型,则将比较值,而不是引用。==


答案 2

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

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

new Integer(1) == new Integer(1)返回 ,而返回 。falsenew Integer(1).equals(new Integer(1))true


ints 是 java 的一种原始类型。创建 int 时,引用的只是值。在 Java 中比较任何基元类型时,所比较的只是值,而不是内存位置。这就是为什么总是返回 true。5 == 5

将对象与基元类型进行比较时,如果可能,该对象将强制转换为基元类型。有了 a 和 a,这是可能的,所以它们被比较。这就是返回 true 的原因。IntegerIntegerintInteger(1).equals(1)