3

以下に2つの例を投稿しました。

最初の例では、equal-to演算子を使用し、while プロセスは中断する必要があるときに中断するのではなく、永遠に継続します。

2 番目の例では、大なりまたは等しい演算子を使用しており、プロセスは必要なときに中断します。

これはどのように可能ですか?

例 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

.equals()2 つのオブジェクトの値を比較するために使用します。

使用==するたびに、オブジェクトのインスタンスが比較されます。 .equals()から継承されたメソッドObjectで、オブジェクトの値を比較するために使用されます。

于 2013-07-11T19:31:27.263 に答える
5

これは、オートボクシングの不快な効果の 1 つです。

最初の例では、==演算子は同一性を示します。2 つのオブジェクトは、同じインスタンスである場合にのみ等しくなります。

2 番目の例では、「>=」演算子は数値比較を示します。2 つのオブジェクトは自動的にボックス化解除されてから比較されます。

さらにややこしいことに、JVM がInteger値をキャッシュする「小さな」整数 (-128 <= X <= 127、iirc) の範囲があるため、==演算子が機能することがあります。

結論: と を使用.equals().compareTo()ます。

于 2013-07-11T19:34:31.100 に答える
3

例 1 では、演算子==を 2 つ使用するIntegerと、メモリ内の位置が比較されます。これIntegerは、 がクラスと変数myVar1でありmyVar2、オブジェクトであり、2 つのintプリミティブでボックス化されていないためです。一方、例 2 では、演算子を使用すると>=、 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 に答える
3

>=オブジェクトでは機能せず、数値のみです。はInteger箱から出されintsており、適切に比較できます。

ボックス化解除を使用し==ない場合、参照が比較されます。これは、値の比較を保証するものではありません。

以下を使用できます。

(myVar2.equals(myVar1))
于 2013-07-11T19:32:49.157 に答える
2

equals2 つのオブジェクトを比較するときに使用する必要があります。

それでも使用したい場合は>=、auto-unbox (de-autobox)myvar1myvar2:

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

Java での自動ボクシングの簡単なベスト プラクティス: ラッパー クラスは、プリミティブを絶対に使用できない場合にのみ使用する必要があります。

于 2013-07-11T19:44:26.290 に答える
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

を使用すると自動ボックス化解除が発生しますが>=、オブジェクトを比較するため==equals

この質問を確認することをお勧めします

于 2013-07-11T19:33:46.283 に答える
1

ここで参照が同じかどうかを比較していますが、プリミティブ型を比較していません。

if (myVar2 == myVar1)

equals値を比較するために使用する必要があります。

if (myVar2.equals( myVar1 ) )

この>=場合、これは では機能しないObjectため、値をアンボックスして期待どおりに機能します。

于 2013-07-11T19:32:35.360 に答える
1

比較には次のコードを使用します。

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

++ myVar2;
}
于 2013-07-11T19:38:33.980 に答える