При поиске объяснений того, как логическое равенство ==
работает в Java, ответы всегда будут выглядеть примерно так:
- Для примитивов возвращается, имеют ли примитивы одинаковое значение (это включает сравнение примитива с его WrapperObject, когда WrapperObject автоматически распаковывается в примитив).
- Для объектов возвращается, представляют ли они один и тот же объект в куче.
Но все эти объяснения, кажется, подразумевают, что это две разные вещи, что ==
ведет себя по-разному в зависимости от того, сравниваете ли вы Objects с примитивами. Мне кажется, что на самом деле это должно быть одно и то же: взять две переменные из стека и сравнить их значения.
Меняется не поведение ==
, а то, что представляют собой сравниваемые значения. Если вещи, которые вы сравниваете, являются примитивами, то значение в стеке - это значение самого примитива. Если вы сравниваете объекты, то значение в стеке является значением ссылки (и, следовательно, адресом объекта в куче).
Я что-то неправильно понял, или же ==
ведет себя одинаково во всех ситуациях? Бонусные баллы, если вы можете указать мне документацию о том, как это действительно работает под прикрытием.