web-dev-qa-db-ja.com

Javaが整数が等しいと認識しないのはなぜですか?

等しいはずの整数があります(出力で確認します)。しかし、私のif条件では、Javaはこれらの変数が同じ値を持つことを認識していません。

私は次のコードを持っています:

if (pay[0]==point[0] && pay[1]==point[1]) {
    game.log.fine(">>>>>> the same");
} else {
    game.log.fine(">>>>>> different");
}
game.log.fine("Compare:" + pay[0] + "," + pay[1] + " -> " + point[0] + "," + point[1]);

そして、次の出力を生成します。

FINE: >>>>>> different
FINE: Compare:: 60,145 -> 60,145

おそらく私はpointがそのように定義されていることを追加する必要があります:

Integer[] point = new Integer[2];

ループコンストラクタから取得したpay us:

for (Integer[] pay : payoffs2exchanges.keySet())

したがって、これら2つの変数はどちらも整数型です。

27
Roman

オブジェクト(Integersなど)は、_==_ではなく.equals()で比較する必要があります。

理解しておくべき重要なことは、いくつかの異なるIntegerオブジェクトが同じint値を表すことができるということです。プログラムが_>>> different_を出力する場合、最初のオブジェクトは2番目のオブジェクトと同じ同じオブジェクトではないとだけ表示されます。 (おそらく、オブジェクトが表す値に基づいてオブジェクトを比較する必要があります。)

オートボクシングの 公式ガイド から:

[...] ==演算子は、整数式で参照ID比較を実行し、int式で値の等価比較を実行します。 [...]

オートボクシングは[-128、127]の範囲の整数値に対して同じオブジェクトを返すことが保証されていますが、実装はその裁量により、その範囲外の値をキャッシュする場合があることに注意してください。

私の一般的な推奨事項は、すべてのローカル/メンバー変数にintではなくIntegerを使用することです。この特定のケースでは、2要素の配列に座標を格納しているようです。これをCoordinatesクラスなどにカプセル化し、ここでequalsメソッド(およびhashCode)をオーバーライドすることをお勧めします。

こちらもご覧ください

57
aioobe

それらが単純なint型である場合、機能します。

Integerの場合は、比較で.intValue()またはcompareTo(Object other)またはequals(Object other)を使用します。

12
sje397

ここで区別する2つのタイプがあります。

  • int、ほとんどの場合に使用するプリミティブ整数型ですが、オブジェクト型ではありません
  • Integerintのオブジェクトラッパー。オブジェクトを必要とするAPIで整数を使用するために使用できます。
4

Java -128から127の範囲内の数値はキャッシュされるため、比較しようとすると

Integer i=12 ;
Integer j=12 ; // j is pointing to same object as i do.
if(i==j)
   print "true";

これは機能しますが、上記の範囲外の数値を使用する場合、「==」は両方が同じオブジェクトではなく同じ値かどうかをチェックするため、値を比較するためにequalsメソッドと比較する必要があります。

2

2つのオブジェクトを比較しようとすると(Integerは変数ではなくオブジェクトです)、結果は常に等しくありません。

あなたの場合は、オブジェクトのフィールドを比較する必要があります(この場合はintValue)

integerオブジェクトの代わりにint変数を宣言してみてください、それは助けになります

1
Andrzej Bobak

の状態

pay[0]==point[0]

式、等価演算子==を使用して参照を比較する

Integer pay[0]

参照と等しい

Integer point[0]

一般に、プリミティブ型の値(int、...など)を==と比較すると、両方の値が同一であれば結果はtrueになります。参照(Integer、Stringなど)が==と比較されるとき、両方の参照がメモリ内の同じオブジェクトを参照している場合、結果はtrueです。オブジェクトの実際の内容(または状態情報)が等しいかどうかを比較するには、メソッドを呼び出す必要があります。したがって、これで

Integer[] point = new Integer[2];

式では、新しい参照を持つ新しいオブジェクトを作成し、それをポイント変数に割り当てます。

例えば:

int a = 1;
int b = 1;
Integer c = 1;
Integer d = 1;
Integer e = new Integer(1);

Aとbを比較するには:

a == b

どちらもプリミティブ型の値だからです。

Aとcを比較するには:

a == c

自動ボクシング機能のため。

eとcを比較する場合:

c.equals(e)

e変数の新しい参照のため。

cとdを比較する場合は、使用する方が安全です。

  c.equals(d)

のため:

ご存知のように、ラッパーオブジェクトに適用される==演算子は、オブジェクトが同じメモリ位置を持っているかどうかのみをテストします。したがって、次の比較はおそらく失敗します。

Integer a = 1000;
Integer b = 1000;
if (a == b) . . .

ただし、Java実装は、選択した場合、一般的に発生する値を同一のオブジェクトにラップする可能性があるため、比較が成功する可能性があります。このあいまいさは、あなたが望むものではありません。ラッパーオブジェクトを比較するときのメソッド。

0
MMKarami