С точки зрения Java 1.5 вы можете в значительной степени обменивать Integer
с int
во многих ситуациях.Java: Целое число равно ==
Однако, я нашел потенциальный дефект в моем коде, который немного меня удивил.
Следующий код:
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), но до сих пор никто не сообщал о проблеме после того, как сотни тестов выполняли этот фрагмент кода.
Нельзя ли использовать ==
для сравнения двух значений Integer
?
В дополнение ко всем тонким ответам ниже, следующая ссылка stackoverflow содержит довольно немного дополнительной информации. Это на самом деле был бы ответил на мой оригинальный вопрос, а потому, что я не упомянул Autoboxing в моем вопросе, он не появлялся в выбранных предложений:
Why can't the compiler/JVM just make autoboxing “just work”?
Спасибо, это точно объясняет, почему 137 терпит неудачу! И он также отвечает на мой вопрос о том, почему это не распространенная проблема, в 95% случаев, с которыми я столкнулся, значение будет ниже 127. Хорошо поймать это сейчас, хотя для 5%, где это не так. –
Интересная заметка: до пары недель назад cdiCt и cdsCt были как ints, так что все было в порядке, но мне пришлось сделать их целыми, чтобы проверить нулевую ситуацию, которая обрабатывается по-разному ... –
@Jeremy Да, это довольно неясная проблема, но в качестве общего правила вы используете .equals() для объектов и == для примитивов. Вы не можете полагаться на autounboxing для тестирования равенства. – Adam