2つのInteger
オブジェクト(int
ではなく)を比較する必要があります。それらを比較する標準的な方法は何ですか?
Integer x = ...
Integer y = ...
私はこれを考えることができます:
if (x == y)
==
演算子は参照のみを比較するため、これは低い整数値に対してのみ機能します。しかし、おそらくオートボクシングが始まります...?
if (x.equals(y))
これは高価な操作のように見えます。この方法で計算されたハッシュコードはありますか?
if (x.intValue() == y.intValue())
少し冗長...
編集:ご回答ありがとうございます。私は今何をすべきかを知っていますが、事実はすべての既存の回答(削除されたものも含めて)に分散されています:)したがって、3つの比較の可能性すべて、または少なくとも最初の2つの比較を指すベストアンサーを受け入れます。
これが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()
を使用します。
equals
メソッドを使用します。なぜあなたはそれが高価だと心配するのですか?
_if (x.equals(y))
_これは高価な操作のように見えます。この方法で計算されたハッシュコードはありますか?
高価な操作ではなく、ハッシュコードは計算されません。 Javaは魔法のようにハッシュコードを計算しません。equals(...)
は単なるメソッド呼び出しであり、他のメソッド呼び出しと違いはありません。
JVMはおそらくメソッド呼び出しを最適化(メソッド内で行われる比較をインライン化)しさえするので、この呼び出しは2つのプリミティブint
値で_==
_を使用するよりもそれほど高価ではありません。
注:時期尚早にマイクロ最適化を適用しないでください。コードはパフォーマンスのボトルネックではないため、「これは遅くなければならない」などの仮定は間違っているか問題ではない可能性が高いです。
マイナーノート:Java 1.7以来、Integerクラスには静的compare(Integer, Integer)
メソッドがあるため、Integer.compare(x, y)
を呼び出すだけで完了します(質問について最適化は別として)。
もちろん、そのコードは1.7より前のJavaのバージョンと互換性がないため、代わりにx.compareTo(y)
を使用することをお勧めします。
X.equals(y)を使用します。これは、すべてのクラスの同等性をチェックする一貫した方法だからです。
パフォーマンスに関する限り、equalsはintValue()を呼び出すため、実際にはより高価です。
編集:ほとんどの場合、オートボクシングを避ける必要があります。特に著者は自分が何をしていたのか分からないので、本当に混乱する可能性があります。このコードを試すと、その結果に驚くでしょう。
Integer a = 128;
Integer b = 128;
System.out.println(a==b);
「等しい」です。安全のために、null-nessをテストする必要があります。
x == y || (x != null && x.equals(y))
x == yは、null == nullをテストします。
コードは、頻繁に呼び出されるとJITによってインライン化されるため、パフォーマンスの考慮事項は重要ではありません。
もちろん、可能であれば、「整数」を避けて単純な「int」を優先するのが最善の方法です。
[追加]
また、同等性テストが対称であることを保証するためにnullチェックが必要です-x.equals(y)はy.equals(x)と同じである必要がありますが、それらの1つがnullの場合はそうではありません。
整数を比較し、値を昇順または降順に出力します。必要なことは、Comparatorインターフェイスを実装し、その比較メソッドをオーバーライドして、その値を以下のように比較することだけです。
@Override
public int compare(Integer o1, Integer o2) {
if (ascending) {
return o1.intValue() - o2.intValue();
} else {
return o2.intValue() - o1.intValue();
}
}
私は自分のコードでこれに遭遇しましたが、それを理解するのに時間がかかりました。 2つの並べ替えられたリストの共通部分を実行していましたが、出力には小さな数字しか表示されませんでした。比較中に(x - y == 0)
の代わりに(x == y)
を使用することで動作させることができました。
Integerクラスは_Comparable<Integer>
_を実装しているため、試すことができます。
_x.compareTo(y) == 0
_
また、等式ではなく、これらの整数を比較したい場合は、
x.compareTo(y) < 0
は、xがyより小さいかどうかを通知します。
x.compareTo(y) > 0
は、xがyより大きいかどうかを通知します。
もちろん、これらの例では、これらの呼び出しを行う前にxがnullでないことを確認するのが賢明です。