Это похоже на интернализацию строк?
Да - по существу все целые числа, которые могут вписываться в байты (от -128 до +127), интернированы и, таким образом, имеют один и тот же базовый объект. Более крупных нет, и, следовательно, , вероятно, не используют один и тот же базовый объект (это описано в JLS 5.1.7) - хотя обратите внимание, что в спецификации нет ничего, что предотвращало бы большие целые числа, разделяющие один и тот же базовый объект, если кто-то был чтобы выбрать для реализации VM таким образом.
Я бы предположил, что обоснование состоит в том, что «меньшие» целые числа в этом диапазоне используются гораздо чаще, чем более крупные, поэтому использование одинаковых базовых объектов стоит того, чтобы уменьшить потенциальную площадь памяти.
В вашем примере new Integer(100) == new Integer(100)
это не так, поскольку вы явно создаете новые целые объекты, аналогично тому, как new String("hi") == new String("hi")
оценивает значение false.
Просто повторно итерация - при сравнении целых чисел, как это во всех реальных сценариях, то .equals()
следует использовать (или, предпочтительно, по-прежнему, == с примитивными числами, если не хороший случай для использования типа объекта.)
Да, это так. Спасибо – enotpolaskun