Вопрос-ответ

Java Integer compareTo() - why use comparison vs. subtraction?

Java Integer compareTo () - зачем использовать сравнение по сравнению с вычитанием?

Я обнаружил, что 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;
Переведено автоматически
Ответ 1

Это связано с целочисленным переполнением. Когда thisVal очень велико и anotherVal отрицательно, то вычитание последнего из первого дает результат, который больше, чем thisVal который может превысить отрицательный диапазон.

Ответ 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 переполнения. Еще один урок заключается в том, что вам следует избегать "умного" кода. Стремитесь писать понятный, корректный код и не оптимизируйте его, если в этом нет необходимости.



Ответ 3

Проще говоря, int тип недостаточно велик, чтобы хранить разницу между двумя произвольными int значениями. Например, разница между 1,5 миллиардами и -1,5 миллиардами составляет 3,0 миллиарда, но int не может содержать значения, превышающие 2,1 миллиарда.

Ответ 4

Возможно, это для того, чтобы избежать переполнения / недостаточного потока.

java