31

我有以下代码:

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

但是,更改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");
        }

    } 

}

新输出:

1. true
2. true

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

4

5 回答 5

39

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

对于原始类型,==检查值是否相等。

java.lang.Integer是引用类型。int是原始类型。

编辑:如果一个操作数是原始类型,而另一个是拆箱到合适原始类型的引用类型,==则将比较值,而不是引用。

于 2012-09-22T20:06:04.297 回答
7

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

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

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


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

当您将Integer对象与原始类型进行比较时,如果可能,该对象将被强制转换为原始类型。使用 anInteger和 anint这是可能的,因此将它们进行比较。这就是Integer(1).equals(1)返回 true 的原因。

于 2012-09-22T20:05:56.233 回答
2

您将使用什么new Integer(1)来创建新对象,它每次都会创建一个完全不同的对象,即使它具有相同的值。'==' 检查对象是否相同,而不是数据值。在您的情况下,您可以按如下方式检查该值:

if(alpha.intValue() == foo.intValue()) {
 // 
}
于 2012-09-22T20:11:54.413 回答
1

Integer == int 这里应用了自动装箱(所以 Integer 在比较之前转换为 int )所以真的..但是 Integer == Integer 这里的对象比较所以引用不同所以假..

于 2012-09-22T20:07:01.490 回答
0

第一个示例:在对象之间使用 == 运算符检查引用是否相等,并且由于您正在比较两个不同的对象,因此它们不相等。

第二个示例:当在包装类型(Integer、Long 等)和数字类型(int、long 等)之间使用 == 时,包装类型被取消装箱,并且在两个原始数字类型之间进行相等性检查(即在intint之间)。拆箱是二进制数字提升的一部分,在此处阅读更多信息:http: //docs.oracle.com/javase/specs/jls/se7/html/jls-5.html#jls-5.6.2

于 2012-09-22T20:07:30.660 回答