Java: целое число равно vs. ==JAVA

Программисты JAVA общаются здесь
Anonymous
Java: целое число равно vs. ==

Сообщение Anonymous »

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

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

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

Код: Выделить всё

Integer cdiCt = ...;
Integer cdsCt = ...;
...
if (cdiCt != null && cdsCt != null && cdiCt != cdsCt)
mismatch = true;
похоже, что неправильно устанавливалось несоответствие, когда значения были равны, хотя я не могу определить, при каких обстоятельствах. Я установил точку останова в Eclipse и увидел, что целочисленные значения равны 137, и я проверил логическое выражение, и оно сказало, что оно ложно, но когда я перешагнул через него, оно установило несоответствие в значение true.

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

Код: Выделить всё

if (cdiCt != null && cdsCt != null && !cdiCt.equals(cdsCt))
проблема решена.

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

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

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

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

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

Подробнее здесь: https://stackoverflow.com/questions/363 ... -equals-vs

Вернуться в «JAVA»