87

java.lang.Integerメソッドの実装はcompareTo次のようになります。

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

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

return thisVal - anotherVal;
4

5 に答える 5

103

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

于 2010-04-28T11:02:18.133 に答える
67

2 つの数値を比較する引き算の「トリック」が破られた!!!

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

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

このイディオムは使用しないでください。うまくいきません。

さらに、それが機能したとしても、パフォーマンスが大幅に向上することはなく、実際には可読性が犠牲になる可能性があります

こちらもご覧ください

  • Java Puzzlers Puzzle 65: 疑わしいソートのストレンジ・サーガ

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

于 2010-04-28T11:09:28.400 に答える
9

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

于 2010-04-28T12:03:59.077 に答える
3

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

于 2010-04-28T11:02:49.913 に答える
2

In addition to the overflow thing, you should note that the version with substraction does not give the same results.

  • The first compareTo version returns one of three possible values: -1, 0, or 1.
  • If you replace the last line with substraction, the result can be any integer value.

If you know there will be no overflow, you could use something like this:

public int compareTo(Integer anotherInteger) {
    return sign(this.value - anotherInteger.valuel);
}
于 2010-04-28T13:23:07.957 に答える