Подтвердить что ты не робот

Почему "<", ">" работает с классами-оболочками, а "==" - нет?

Я знаю, что '==' не работает со значениями вне диапазона [-128,127], поскольку в этом диапазоне хранится кеш, содержащий объекты Integer, и возвращается эта же ссылка, если значение находится в пределах диапазона. Но почему ' > ', '<', ' > =', '< =' дают правильные ответы даже вне диапазона?

Integer a=150;
Integer b=150;
System.out.println(a==b); //returns false

Integer a=150;
Integer b=150;
System.out.println(a>=b); // returns true

Почему это происходит?

4b9b3361

Ответ 1

Операторы <, >, <= и >= определены только для примитивных типов. Поэтому использование их в типах-оболочках заставляет компилятор распаковывать объекты в примитивы.

Это означает

System.out.println(a>=b);

эквивалентно

System.out.println(a.intValue()>=b.intValue());

Однако операторы == и != существуют как для примитивных типов, так и для ссылочных типов, поэтому их использование для сравнения двух объектов примитивных типов-оболочек сравнивает ссылки вместо примитивных значений, которые они завершают.

Как отметил Хольгер, сравнение ссылок на объекты с == и != существовало на языке Java до того, как были введены автоматическое боксирование и автоматическая распаковка, но сравнение с <, >, <= и >= не поддерживался для каких-либо ссылочных типов до того, как была введена автоматическая распаковка.

Это означает, что в первые дни Java a>=b вашего фрагмента кода не будет передавать компиляцию (поскольку a и b не являются примитивными числовыми типами). С другой стороны, ваш фрагмент a==b все равно передаст компиляцию и вернет false.

Изменение поведения == и != для ссылочных типов, которые являются оберткими числовых примитивов, изменяет поведение существующего кода, тем самым нарушая обратную совместимость, что, вероятно, является причиной, по которой это не было сделано.