Спецификация языка Java 5.1.7 :
Если упаковываемое значение p равно true, false, byte, char в диапазоне от до , или int или короткое число между -128 и 127, то пусть r1 и r2 будут результатами любых двух преобразований упаковки с. Всегда так, что r1 == r2.
а также:
Обсуждение
В идеале упаковка заданного примитивного значения p всегда будет давать идентичную ссылку. На практике это может оказаться неосуществимым при использовании существующих методов реализации. Приведенные выше правила являются прагматичным компромиссом. Последний пункт выше требует, чтобы определенные общие значения всегда были упакованы в неразличимые объекты. Реализация может кэшировать их, лениво или нетерпеливо.
Для других значений эта формулировка не допускает никаких предположений об идентичности заключенных в рамки значений со стороны программиста. Это позволит (но не потребует) совместного использования некоторых или всех этих ссылок.
Это гарантирует, что в большинстве распространенных случаев поведение будет желаемым, без чрезмерного снижения производительности, особенно на небольших устройствах. Реализации с меньшим объемом памяти могут, например, кэшировать все символы и короткие, а также целые и длинные значения в диапазоне от -32 КБ до +32 КБ.
Итак, в некоторых случаях == будет работать, во многих других - нет. Всегда используйте .equals, чтобы быть в безопасности, поскольку вы не можете предоставить (как правило), как были получены экземпляры.
Если скорость является фактором (большинство .equals начинаются со сравнения == или, по крайней мере, должны), И вы можете гарантировать, как они были распределены И они соответствуют указанным выше диапазонам, тогда == безопасно.
Некоторые виртуальные машины могут увеличить этот размер, но безопаснее принять наименьший размер, указанный в спецификации языка, чем полагаться на определенное поведение виртуальной машины, если только вам это действительно не нужно.
person
TofuBeer
schedule
09.04.2009