Java: целое число равно против ==

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

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

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

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

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

Изменение условного на:

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

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

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

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

Это все еще не законно использовать== сравнить дваInteger ценности?

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

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

Ответы на вопрос(5)

Ваш ответ на вопрос