web-dev-qa-db-ja.com

Java Integer compareTo()-なぜ比較対減算を使用するのですか?

compareToメソッドのJava.lang.Integerの実装は次のようになることがわかりました。

public int compareTo(Integer anotherInteger) {
    int thisVal = this.value;
    int anotherVal = anotherInteger.value;
    return (thisVal<anotherVal ? -1 : (thisVal==anotherVal ? 0 : 1));
}

問題は、減算ではなく比較を使用する理由です。

return thisVal - anotherVal;
78
Vladimir

これは整数オーバーフローが原因です。 thisValが非常に大きく、anotherValが負の場合、前者から後者を引くと、負の範囲にオーバーフローする可能性があるthisValより大きい結果が得られます。

91
Itay Maman

2つの数値を比較するための減算「トリック」が壊れています!!!

        int a = -2000000000;
        int b =  2000000000;
        System.out.println(a - b);
        // prints "294967296"

ここに、 a < b、まだa - bは正です。

このイディオムは使用しないでください。動かない。

さらに、それが機能しても[〜#〜] [〜#〜]は大幅な改善を提供しませんパフォーマンス、そして実際には読みやすさが犠牲になる場合があります。

こちらもご覧ください

  • Java Puzzlers パズル65:怪しいソートの奇妙な物語

    このパズルにはいくつかの教訓があります。最も具体的なものは次のとおりです:値の差が決して大きくならないことが確実でない限り、減算ベースのコンパレータを使用しないでくださいInteger.MAX_VALUE。より一般的には、intオーバーフローに注意してください。別の教訓は、「賢い」コードを避けるべきだということです。明確で正しいコードを書くように努め、必要でない限り最適化しないでください。

63

簡単に言えば、int型は2つの任意のint値の差を格納するのに十分な大きさではありません。たとえば、15億から-15億の差は30億ですが、intは21億を超える値を保持できません。

9
fredoverflow

おそらくそれはオーバーフロー/アンダーフローを回避することです。

3
Adamski

オーバーフローに加えて、減算同じ結果が得られないのバージョンに注意してください。

  • 最初のcompareToバージョンは、-1、0、または1の3つの可能な値のいずれかを返します。
  • 最後の行を減算で置き換えると、結果は任意の整数値になる可能性があります。

オーバーフローがないことがわかっている場合は、次のようなものを使用できます。

public int compareTo(Integer anotherInteger) {
    return sign(this.value - anotherInteger.valuel);
}
1
PauliL