- Почему они так поступили?
Каждое целое число от -128 до 127 кэшируется Java. Они сделали это, предположительно, для повышения производительности. Даже если бы они хотели вернуться к этому решению сейчас, вряд ли они это сделают. Если кто-нибудь построит код, зависящий от этого, его код сломается, когда он будет удален. Для хобби-кодирования это, возможно, не имеет значения, но для корпоративного кода люди расстраиваются и случаются судебные процессы.
- Почему они не просто кэшируют все целые числа, используемые программой?
Все целые числа не могут быть кэшированы, потому что последствия для памяти будут огромными.
- Почему JVM не всегда автоматически распаковывается в примитив?
Потому что JVM не может знать, что вы хотели. Кроме того, это изменение может легко сломать устаревший код, не созданный для обработки этого случая.
Если JVM автоматически распаковывается в примитивы при вызовах ==, эта проблема на самом деле станет еще более запутанной. Теперь вам нужно помнить, что == всегда сравнивает ссылки на объекты, если только объекты не могут быть распакованы. Это приведет к еще более странным запутанным случаям, аналогичным тому, который вы указали выше.
Вместо этого слишком переживайте по этому поводу, просто запомните это правило:
НИКОГДА сравнивать объекты с ==, если только вы не собираетесь сравнивать их по их ссылкам. Если вы сделаете это, я не могу вспомнить сценарий, в котором вы столкнетесь с проблемой.