3

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

在第一个示例中,我使用了等于运算符,而 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;
  }

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

4

9 回答 9

5

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

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

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

更令人困惑的是,JVM 缓存了一系列“小”整数(-128 <= X <= 127, iirc)Integer,因此==运算符有时可以工作。

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

于 2013-07-11T19:34:31.100 回答
5

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

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

于 2013-07-11T19:31:27.263 回答
3

>=不适用于对象,仅适用于数字。Integers 已拆箱,ints可以正确比较。

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

您可以使用:

(myVar2.equals(myVar1))
于 2013-07-11T19:32:49.157 回答
3

在示例 1 中,当您将运算符==与两个一起使用时,Integer您正在比较它们在内存中的位置,因为Integer是一个类和变量myVar1,并且myVar2是对象并且它们没有在两个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;
}
于 2013-07-11T20:09:53.583 回答
2

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

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

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

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

于 2013-07-11T19:44:26.290 回答
1

使用此代码进行比较:

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

++ myVar2;
}
于 2013-07-11T19:38:33.980 回答
1

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

我建议你检查这个问题

于 2013-07-11T19:33:46.283 回答
1

在 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;
  }
于 2013-07-11T19:41:25.943 回答
1

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

if (myVar2 == myVar1)

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

if (myVar2.equals( myVar1 ) )

对于这种>=情况,这不适用于 an Object,因此它将取消包装值并按预期​​工作。

于 2013-07-11T19:32:35.360 回答