【问题标题】:When comparing two equal integers in while loop, the equal-to operator fails?在while循环中比较两个相等的整数时,等于运算符失败?
【发布时间】:2013-07-11 19:29:47
【问题描述】:

我在下面发布了两个示例。

在第一个示例中,我使用 equal-to 运算符,while 过程将永远继续,而不是在应该中断的时候中断。

在第二个示例中,我使用了 大于或等于 运算符,并且该过程在应该中断时中断。

这怎么可能?

示例 1:

  Integer myVar1 = 42985;
  Integer myVar2 = 1;
  while (true)
  {
     if (myVar2 == myVar1)
     {
     break;
     }

  ++ myVar2;
  }

示例 2:

  Integer myVar1 = 42985;
  Integer myVar2 = 1;
  while (true)
  {
     if (myVar2 >= myVar1)
     {
     break;
     }

  ++ myVar2;
  }

编辑: 谢谢大家的精彩回答! 我现在完全理解了这个问题,这个新信息解释了我在我的应用程序中遇到的几个奇怪的行为。 我希望我可以选择多个最佳答案。

【问题讨论】:

    标签: java android break comparison-operators


    【解决方案1】:

    这是自动装箱不太令人愉快的效果之一。

    在您的第一个示例中,== 运算符表示身份相等:两个对象只有在它们是同一个实例时才会相等。

    在您的第二个示例中,“>=”运算符表示数字比较:这两个对象将被自动拆箱,然后进行比较。

    让事情变得更加混乱,有一个“小”整数范围(-128 Integer 值,所以 == 运算符有时 em> 有效。

    底线:使用.equals().compareTo()

    【讨论】:

    • 在任何情况下我都想使用 '==' 运算符,或者我应该完全停止使用它吗?另外,'!=' 运算符呢?它有同样的缺陷吗?
    • @EricGlass - 正如我所说,使用.equals().compareTo()唯一您应该将== 用于对象的时间是当您明确测试对象身份时(我发现我很少这样做)。
    【解决方案2】:

    您将需要使用.equals() 来比较两个对象的值。

    任何时候你使用== 它都会比较对象的实例。 .equals() 是继承自Object 的方法,用于比较对象的值。

    【讨论】:

      【解决方案3】:

      >= 不适用于对象,只能用于数字。 Integers 被拆箱成 ints 可以正确比较。

      当使用== 时,不会发生拆箱,因此会比较引用。永远不能保证会比较这些值。

      你可以使用:

      (myVar2.equals(myVar1))
      

      【讨论】:

        【解决方案4】:

        在示例 1 中,当您使用运算符 == 和两个 Integer 时,您是在比较它们在内存中的位置,因为 Integer 是一个类,变量 myVar1myVar2 是对象,它们是没有在两个 int 原语中取消装箱,而在示例 2 中,当您使用运算符 >= 时,两个 Integer 对象被取消装箱,并且进程在应该时中断。 可以使用运算符equals

        Integer myVar1 = 42985;
        Integer myVar2 = 1;
        while (true) {
            if (myVar2.equals(myVar1)) {
                break;
            }
        
        
            ++myVar2;
        }
        

        或者你可以试试intValue()的方法:

        Integer myVar1 = 42985;
        Integer myVar2 = 1;
        while (true) {
            if (myVar2.intValue() == myVar1.intValue()) {
            break;
        }
        
        ++myVar2;
        }
        

        如果 Integer 对象值等于或小于 127,则运算符 == 将起作用:

        Integer myVar1 = 127;
        Integer myVar2 = 1;
        while (true) {
            if (myVar2 == myVar1) {
                break;
        }
        
        
        ++myVar2;
        }
        

        【讨论】:

        • 非常感谢您的 intValue() 建议!
        【解决方案5】:

        比较 2 个对象时,您必须使用 equals

        如果您仍想使用>=,则自动拆箱(de-autobox)myvar1myvar2

        if (myVar2.intValue() >= myVar1.intValue())
        

        Java 中自动装箱的简单最佳实践:仅当您绝对不能使用原语时才应使用包装类。

        【讨论】:

        • 非常感谢您的 intValue() 建议!
        【解决方案6】:

        当您使用 >= 时会发生自动拆箱,但在与 == 比较时不会发生自动拆箱使用 equals 比较对象

        我建议你检查这个question

        【讨论】:

          【解决方案7】:

          使用此代码进行比较:

           Integer myVar1 = 42985;
           Integer myVar2 = 1;
           while (true)
          {
           if (myVar2.equals(myVar1))
           {
           break;
           }
          
          ++ myVar2;
          }
          

          【讨论】:

            【解决方案8】:

            你在这里比较的是引用是否相同,你不是在比较原始类型:

            if (myVar2 == myVar1)
            

            您应该使用equals 来比较这些值:

            if (myVar2.equals( myVar1 ) )
            

            对于>= 的情况,这不适用于Object,因此它将解开值并按预期​​工作。

            【讨论】:

              【解决方案9】:

              在 Java 中,'int' 类型是原始类型,而 'Integer' 类型是对象。

              所以比较对象使用equals()方法

              所以要么使用:

               Integer myVar1 = 42985;
               Integer myVar2 = 1;
               while (true)
                {
                  if (myVar2.equals(myVar1))
                   {
                    break;
                   }
              
                   ++ myVar2;
                }
              

              使用 int

              声明它
              int myVar1 = 42985;
               int myVar2 = 1;
               while (true)
                {
                  if (myVar1==myVar2)
                   {
                    break;
                   }
              
                   ++ myVar2;
                }
              

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 2019-03-02
                • 1970-01-01
                • 2011-04-25
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多