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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

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