Начиная с 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и протестировать), но до сих пор никто не сообщил о проблеме после сотен тестов, выполняющих этот фрагмент кода.
Разве все еще не разрешено использовать ==
для сравнения двух Integer
значений?
В дополнение ко всем точным ответам, приведенным ниже, следующая ссылка на stackoverflow содержит довольно много дополнительной информации.Это на самом деле ответило бы на мой первоначальный вопрос, но поскольку я не упомянул автобокс в своем вопросе, он не появился в выбранных предложениях:
Почему компилятор / JVM не может простосделать автобокс «просто работать»?