web-dev-qa-db-ja.com

2つの整数を比較するにはどうすればよいですか?

2つのIntegerオブジェクト(intではなく)を比較する必要があります。それらを比較する標準的な方法は何ですか?

Integer x = ...
Integer y = ...

私はこれを考えることができます:

if (x == y) 

==演算子は参照のみを比較するため、これは低い整数値に対してのみ機能します。しかし、おそらくオートボクシングが始まります...?

if (x.equals(y)) 

これは高価な操作のように見えます。この方法で計算されたハッシュコードはありますか?

if (x.intValue() == y.intValue())

少し冗長...

編集:ご回答ありがとうございます。私は今何をすべきかを知っていますが、事実はすべての既存の回答(削除されたものも含めて)に分散されています:)したがって、3つの比較の可能性すべて、または少なくとも最初の2つの比較を指すベストアンサーを受け入れます。

34
Daniel Rikowski

これがequalsメソッドの機能です。

_public boolean equals(Object obj) {
    if (obj instanceof Integer) {
        return value == ((Integer)obj).intValue();
    }
    return false;
}
_

ご覧のとおり、ハッシュコードの計算はありませんが、他にもいくつかの操作が行われています。 x.intValue() == y.intValue()はわずかに高速かもしれませんが、そこでマイクロ最適化の領域に入ります。さらに、コンパイラーは、equals()呼び出しをとにかく最適化するかもしれませんが、確かなことはわかりません。

通常、プリミティブintを使用しますが、Integerを使用する必要がある場合は、equals()を使用します。

33
Jeff

equalsメソッドを使用します。なぜあなたはそれが高価だと心配するのですか?

26
svenningsson
_if (x.equals(y))
_

これは高価な操作のように見えます。この方法で計算されたハッシュコードはありますか?

高価な操作ではなく、ハッシュコードは計算されません。 Javaは魔法のようにハッシュコードを計算しません。equals(...)は単なるメソッド呼び出しであり、他のメソッド呼び出しと違いはありません。

JVMはおそらくメソッド呼び出しを最適化(メソッド内で行われる比較をインライン化)しさえするので、この呼び出しは2つのプリミティブint値で_==_を使用するよりもそれほど高価ではありません。

注:時期尚早にマイクロ最適化を適用しないでください。コードはパフォーマンスのボトルネックではないため、「これは遅くなければならない」などの仮定は間違っているか問題ではない可能性が高いです。

13
Jesper

マイナーノート:Java 1.7以来、Integerクラスには静的compare(Integer, Integer)メソッドがあるため、Integer.compare(x, y)を呼び出すだけで完了します(質問について最適化は別として)。

もちろん、そのコードは1.7より前のJavaのバージョンと互換性がないため、代わりにx.compareTo(y)を使用することをお勧めします。

9
ktbiz

X.equals(y)を使用します。これは、すべてのクラスの同等性をチェックする一貫した方法だからです。

パフォーマンスに関する限り、equalsはintValue()を呼び出すため、実際にはより高価です。

編集:ほとんどの場合、オートボクシングを避ける必要があります。特に著者は自分が何をしていたのか分からないので、本当に混乱する可能性があります。このコードを試すと、その結果に驚くでしょう。

Integer a = 128;
Integer b = 128;

System.out.println(a==b);
8
ZZ Coder

「等しい」です。安全のために、null-nessをテストする必要があります。

x == y || (x != null && x.equals(y))

x == yは、null == nullをテストします。

コードは、頻繁に呼び出されるとJITによってインライン化されるため、パフォーマンスの考慮事項は重要ではありません。

もちろん、可能であれば、「整数」を避けて単純な「int」を優先するのが最善の方法です。

[追加]

また、同等性テストが対称であることを保証するためにnullチェックが必要です-x.equals(y)はy.equals(x)と同じである必要がありますが、それらの1つがnullの場合はそうではありません。

2
mfx

整数を比較し、値を昇順または降順に出力します。必要なことは、Comparatorインターフェイスを実装し、その比較メソッドをオーバーライドして、その値を以下のように比較することだけです。

@Override
public int compare(Integer o1, Integer o2) {
    if (ascending) {
        return o1.intValue() - o2.intValue();
    } else {
        return o2.intValue() - o1.intValue();
    }

}
2
user3468976

私は自分のコードでこれに遭遇しましたが、それを理解するのに時間がかかりました。 2つの並べ替えられたリストの共通部分を実行していましたが、出力には小さな数字しか表示されませんでした。比較中に(x - y == 0)の代わりに(x == y)を使用することで動作させることができました。

1
Abhinav

Integerクラスは_Comparable<Integer>_を実装しているため、試すことができます。

_x.compareTo(y) == 0
_

また、等式ではなく、これらの整数を比較したい場合は、

x.compareTo(y) < 0は、xがyより小さいかどうかを通知します。

x.compareTo(y) > 0は、xがyより大きいかどうかを通知します。

もちろん、これらの例では、これらの呼び出しを行う前にxがnullでないことを確認するのが賢明です。

1
jhumble