Java: Integer равно vs. ==

Начиная с Java 1.5, вы можете в значительной степени обмениваться Integer с int во многих ситуациях.

Однако я обнаружил потенциальный дефект в моем коде, который удивил меня немного.

Следующий код:

Integer cdiCt = ...;
Integer cdsCt = ...;
...
if (cdiCt != null && cdsCt != null && cdiCt != cdsCt)
    mismatch = true;

, казалось, неправильно устанавливал несоответствие, когда значения были равны, хотя я не могу определить, при каких обстоятельствах. Я установил точку останова в Eclipse и увидел, что значения Integer равны 137, и я проверил логическое выражение, и оно сказало, что оно ложно, но когда я перешагнул через него, оно установило несоответствие в true.

Изменение условного выражения на:

if (cdiCt != null && cdsCt != null && !cdiCt.equals(cdsCt))

устранило проблему.

Может кто-нибудь пролить свет на то, почему это произошло? До сих пор я видел только поведение моего локального хоста на своем ПК. В этом конкретном случае код успешно прошел около 20 сравнений, но не удался на 2. Проблема была постоянно воспроизводимой.

Если это распространенная проблема, она должна вызывать ошибки в других наших средах (dev и test), но до сих пор, никто не сообщил о проблеме после сотен тестов, выполняющих этот фрагмент кода.

Разве все еще не разрешено использовать == для сравнения двух целочисленных значений ?

Кроме того на все точные ответы ниже, следующая ссылка на stackoverflow содержит довольно много дополнительной информации. На самом деле он ответил бы на мой первоначальный вопрос, но поскольку я не упомянул автобокс в своем вопросе, он не появился в выбранных предложениях:

Почему можно? компилятор / JVM просто заставляют автобокс «просто работать»?

142
задан Community 23 May 2017 в 12:26
поделиться