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