Long、Integer 和 Short 比较方法的不同实现?

Different implementations of compare method for Long, Integer and Short?

为什么Java的库中LongIntegerShort的静态方法compare的实现不同?

对于Long

public static int compare(long x, long y) {
    return (x < y) ? -1 : ((x == y) ? 0 : 1);
}

对于Integer

public static int compare(int x, int y) {
    return (x < y) ? -1 : ((x == y) ? 0 : 1);
}

对于Short:

public static int compare(short x, short y) {
    return x - y;
}

如果你尝试:

System.out.println(Long.MIN_VALUE - Long.MAX_VALUE);

System.out.println(Integer.MIN_VALUE - Integer.MAX_VALUE);

你会得到 1 因为溢出(更新:这里应该是下溢,正如另一个答案中提到的),这是不正确的。

但是,

System.out.println(Short.MIN_VALUE - Short.MAX_VALUE);

你会得到正确的值 -65535,因为 short 会在 - 操作之前转换为 int,从而防止溢出。

x - y 大概是最有效的(因为备选方案涉及两次分支),因此用于 short.

但是 x - y 不能用于 intlong,因为当结果值不适合 [=14] 时,这将 overflow =],它可以在结果应该为负时给出正值,或者在结果应该为正时给出负值(在任何一种情况下都为零)。

注意:减去两个short时,the resulting value is of type int,永远不会溢出。

// long - long
System.out.println((int)(2147483649l - 1l)); // -2147483648, not 2147483648
// int - int
System.out.println(-2147483648 - 1);         // 2147483647, not -2147483649
// int - int
System.out.println(1 - -2147483648);         // -2147483647, not 2147483649
// short - short
short s1 = -32768, s2 = 1;
System.out.println(s1 - s2);                 // -32769, as desired

它的价值:选择上面的值是因为它们大致在 int(和 short)的最小值和最大值附近,以演示溢出的点。

int 可以具有 [-2147483648, +2147483647] 之间的值。如果从 +2147483647 中减去 -2147483648,您将得到 4294967295。这不能存储在 int 中,因此我们用它来比较 2 个 int

return (x < y) ? -1 : ((x == y) ? 0 : 1);

long也是如此