【问题标题】:Comparing Integer objects [duplicate]比较整数对象[重复]
【发布时间】:2012-09-14 20:38:53
【问题描述】:

我有以下代码:

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 object 的类型更改为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

【问题讨论】:

标签: java oop object


【解决方案1】:

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

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

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

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

【讨论】:

  • 谢谢你,这让我明白了。
  • +1 用于问答。只是为了确保:在(Integer == int)(int == Integer) 的情况下,它将始终被取消装箱到(int == int) 而不是自动装箱到(Integer == Integer)
【解决方案2】:

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

if(alpha.intValue() == foo.intValue()) {
 // 
}

【讨论】:

    【解决方案3】:

    第一个例子: 在对象之间使用 == 运算符检查引用是否相等,因为您正在比较两个不同的对象,所以它们不相等。

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

    【讨论】:

      【解决方案4】:

      此处应用了 Integer == int 自动装箱(因此在比较之前将 Integer 转换为 int)非常正确.. 但是此处 Integer == Integer 对象比较所以引用不同所以错误..

      【讨论】:

        【解决方案5】:

        整数对象是对象。这听起来合乎逻辑,但却是问题的答案。对象是使用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 对象与原始类型进行比较时,如果可能,该对象将被强制转换为原始类型。使用Integerint 这是可能的,因此它们进行了比较。这就是Integer(1).equals(1) 返回 true 的原因。

        【讨论】:

        • +1 以获得清晰的解释。
        猜你喜欢
        • 2014-07-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-03-19
        • 2016-11-10
        • 2012-10-20
        相关资源
        最近更新 更多