【问题标题】:Java integers Return Strange Result While Compare Two Integers?Java整数在比较两个整数时返回奇怪的结果?
【发布时间】:2012-03-14 19:27:31
【问题描述】:
    Integer i1= new Integer(9);
    Integer i2= new Integer(9);

    if(i1==i2){
        System.out.println("true");
    }else{
        System.out.println("false");
    }


    int i3=9;
    int i4=9;

    if(i3==i4){
        System.out.println("true");
    }else{
        System.out.println("false");
    }

    if(i3==i2){
        System.out.println("true");
    }else{
        System.out.println("false");
    }

在上面的代码中,如果第一个 if-else 打印 false,为什么?但是当第二个 Return true 和第三个有 true 时。我认为包装类(如 double、boolean、char)不能比较 True ?

【问题讨论】:

标签: java android


【解决方案1】:

首先 if-else 打印 false。为什么?

== 检查两个引用是否指向同一个对象,在这种情况下它们不是,所以== 检查是false。你需要使用Integer.equals(),而不是==

if (i1.equals(i2){
    System.out.println("true");
}else{
    System.out.println("false");
}

第二次返回真

== 可用于原语:int 是原语。

第三个是真的

正如JB Nizet 所指出的,i2unboxedint,这使得if 条件成为两个int 原语之间的检查。

【讨论】:

  • 但是 == 会发生什么?......
  • 布尔是原始的,不是对象,布尔是一个对象。
  • booleanint 等基元使用==,所以如果你有一个名为isClickedboolean,那么使用isClicked == true 是正确的。
  • i1 和 i2 是两个不同的对象。如果将它们与 == 进行比较,它将返回 false,因为它正在比较两个不同的对象。就好像你使用 equals 一样,你正在比较两个对象的值
  • 如果 isClicked 是一个布尔值,那么将它与另一个布尔值进行比较是没有意义的。只需使用if (isClicked)
【解决方案2】:

另一种“安全”的替代方法是使用模运算

 if ( ( i3%i4)==0) System.out.println("true");

【讨论】:

    【解决方案3】:

    使用自动转换,(int)i1==(int)i2 将返回 true,(i1==i4) 也将返回 true 正如其他 cmets 解释的那样,== 只比较对象(哪些引用是按值传递的)

    【讨论】:

      【解决方案4】:

      第一种情况,JVM 检查 i1 和 i2 是否是同一个引用。由于它们不同,因此结果为假。

      第二种情况没问题,都是原始数据类型,值相同,是的。

      在第三种情况下,i2 首先自动拆箱,然后进行比较,因此结果为 true。

      【讨论】:

        【解决方案5】:

        首先,如果-您正在比较两个对象-它们是不同的。结果 = 假 在第二个 - 你是比较两个 int 值。结果真 在第三 - 你是比较 int 和 Integer,拆箱后你有两个 int。结果——真。 对于整数使用等于。

        【讨论】:

          【解决方案6】:

          == 用于比较对象的引用时,只有当两个引用都指向同一个对象时才返回true。

          在第一种情况下,您有两个不同的对象。

          在第二种情况下,您不是在比较对象,而是在比较原始类型。

          在第三种情况下,Integer 对象被拆箱到它的原始int 值以与原始值进行比较,因此比较了两个原始值。

          你不应该使用== 来比较对象,除了枚举。始终使用.equals()

          【讨论】:

            【解决方案7】:

            记住你不是在比较2 primitives but 2 Objects..所以使用.equals()方法..

            【讨论】:

              【解决方案8】:

              每当您使用“==”时,您都在进行对象引用检查。这意味着,第一次检查将失败,因为它们是 2 个不同的对象。

              在第二种情况下,它是直截了当的。

              在第三种情况下,编译器自动装箱“i2”。因此,比较会正常工作。

              【讨论】:

                【解决方案9】:

                变量i1i2 指的是对象,而不是原始类型。在 Java 中对对象使用 == 运算符检查引用是否相等,如果要比较它们,则应使用 .equals() 方法。

                i3i2 的比较返回 true,因为您将原始类型(int i3)与该原始类型的包装类(整数i2)进行比较,因此 Java 将将i2 的值与int 进行比较,然后将它们进行比较(与== 运算符一起使用)。

                【讨论】:

                  【解决方案10】:

                  运算符 == 正在检查两个 REFERENCES 是否相等。在您的示例中,您实例化了两个不同的整数类型对象,然后询问它们是否相同。

                  如果您想比较整数对象的值,请使用 .compare() 函数,如果您只想检查是否相等,请使用 .equals。

                  【讨论】:

                    猜你喜欢
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 2012-05-12
                    • 1970-01-01
                    • 2012-04-17
                    • 2017-10-23
                    • 2016-01-15
                    • 2015-02-17
                    相关资源
                    最近更新 更多