Java Integer compareTo() - 为什么使用比较与减法?

我发现方法的实现如下所示:java.lang.IntegercompareTo

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

问题是为什么使用比较而不是减法:

return thisVal - anotherVal;

答案 1

这是由于整数溢出。当 非常大且为负时,则从前者中减去后者将产生大于该结果的结果,该结果可能会溢出到负范围。thisValanotherValthisVal


答案 2

比较两个数值的减法“技巧”被打破了!!!

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

在这里,,但却是积极的。a < ba - b

不要使用这个成语。它不起作用。

此外,即使它确实有效,它也不会在性能方面提供任何显着的改进,并且实际上可能会降低可读性。

另请参见

  • Java Puzzlers谜题65:可疑的奇怪传奇

    这个谜题有几个教训。最具体的是:不要使用基于减法的比较器,除非您确定值之间的差值永远不会大于 。更一般地说,要小心溢出。另一个教训是,你应该避免“聪明”的代码。努力编写清晰,正确的代码,除非证明有必要,否则不要对其进行优化。Integer.MAX_VALUEint


推荐