Создает ли java новый объект, когда примитивный тип передается методу, который ожидает оболочку примитивного типа?


Скажем, что у нас есть:

public method(Integer s) {
   ....
}

Java допускает вызов этого метода, делая:

method(7);

Или

int i = 7;
method(i);

Создает ли JVM новое целое число при этом? Если я вызываю метод несколько раз с одним и тем же int, создаю ли я несколько целых чисел или используется "кэшированная" версия объекта-оболочки?

Спасибо.

1 3

1 ответ:

Создает ли JVM новое целое число при этом?

Не для примера, который вы привели, нет-потому что он находится в диапазоне [-128, 127]. Если бы ваш пример был 157 вместо этого, ответ был бы специфичным для реализации.

Из раздела 5.1.7 JLS :

Если значение p, помещаемое в коробку, является true, false, байтом или символом в диапазоне от \ u0000 до \u007f, или int или коротким числом между -128 и 127 (включительно), то пусть r 1 и Р2 быть результатами любых двух боксерских преобразований p. это всегда так, что r1 == r2.

В идеале, боксируя заданное примитивное значение p, всегда будет получаться идентичная ссылка. На практике это может оказаться невозможным при использовании существующих методов реализации. Приведенные выше правила являются прагматическим компромиссом. Последнее предложение выше требует, чтобы некоторые общие значения всегда были упакованы в неразличимые объекты. Реализация может кэшироваться эти-лениво или нетерпеливо. Для других значений эта формулировка не допускает никаких предположений об идентичности упакованных значений со стороны программиста. Это позволит (но не потребует) совместного использования некоторых или всех этих ссылок.

Это гарантирует, что в большинстве случаев поведение будет желаемым, без наложения чрезмерного штрафа за производительность, особенно на небольших устройствах. Менее ограниченные по объему памяти реализации могут, например, кэшировать все значения char и short, а также как int и Long значения в диапазоне от -32К до +32К.