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