Ответ 1
Операторы <
, >
, <=
и >=
определены только для примитивных типов. Поэтому использование их в типах-оболочках заставляет компилятор распаковывать объекты в примитивы.
Это означает
System.out.println(a>=b);
эквивалентно
System.out.println(a.intValue()>=b.intValue());
Однако операторы ==
и !=
существуют как для примитивных типов, так и для ссылочных типов, поэтому их использование для сравнения двух объектов примитивных типов-оболочек сравнивает ссылки вместо примитивных значений, которые они завершают.
Как отметил Хольгер, сравнение ссылок на объекты с ==
и !=
существовало на языке Java до того, как были введены автоматическое боксирование и автоматическая распаковка, но сравнение с <
, >
, <=
и >=
не поддерживался для каких-либо ссылочных типов до того, как была введена автоматическая распаковка.
Это означает, что в первые дни Java a>=b
вашего фрагмента кода не будет передавать компиляцию (поскольку a
и b
не являются примитивными числовыми типами). С другой стороны, ваш фрагмент a==b
все равно передаст компиляцию и вернет false
.
Изменение поведения ==
и !=
для ссылочных типов, которые являются оберткими числовых примитивов, изменяет поведение существующего кода, тем самым нарушая обратную совместимость, что, вероятно, является причиной, по которой это не было сделано.