Почему Byte.compare() и Integer.compare() реализованы по-разному?
Я изучаю источник OpenJDK.
Мое внимание привлекли методы Byte.compare()
и Integer.compare()
:
public static int Byte.compare(byte x, byte y) {
return x-y;
}
public static int Integer.compare(int x, int y) {
return (x < y) ? -1 : ((x == y) ? 0 : 1);
}
Почему методы Byte.compare()
и Integer.compare()
имеют разные реализации?
Ответы
Ответ 1
Реализация Integer.compare
не использует вычитание, так как это может привести к переполнению в случае, если вы сравниваете целое число, близкое к Integer.MIN_VALUE
, другому, которое близко к Integer.MAX_VALUE
.
Это переполнение не может произойти в случае Byte.compare
, так как значения байтов неявно преобразуются в целые числа до вычисления x-y
.
(см. также: Спецификация языка Java - 5.6.2 Двоичное числовое продвижение)
Ответ 2
Метод байтов может быть реализован таким образом, поскольку результат вычитания представляется в int
. Это не так в другом случае. Например:
0 - 0x80000000 == 0x80000000
и это отрицательно, поэтому сравнение ошибочно указывает, что 0 меньше -2 ^ 31