Я получаю Integer или int после помещения int в массив объектов? - PullRequest
2 голосов
/ 18 мая 2010

Будет (1) int a; new Object[] {a} таким же, как (2) new Object[] {new Integer(a)}? Если я сделаю первый, (new Object[]{a})[0] даст мне Integer? спасибо

Ответы [ 2 ]

9 голосов
/ 18 мая 2010

Да и да.

Вы не можете на самом деле положить int в Object[]. То, что вы делаете, использует функцию Java, называемую autoboxing , в которой примитивный тип, такой как int, автоматически переводится в соответствующий класс-оболочку (в данном случае Integer) или наоборот, когда необходимо.

Вы можете узнать больше об этом здесь .

Edit:

Как указывает Джеспер в комментарии ниже, ответ на ваш первый вопрос на самом деле не "да", а "это зависит от значения a". Вызов конструктора Integer(int), как в (2), всегда приведет к созданию нового Integer объекта и его помещению в массив.

В (1), однако, процесс автобоксирования не будет использовать этот конструктор; по сути, это будет Integer.valueOf(a). Этот может создать новый Integer объект или может вернуть ранее существующий кэшированный Integer объект для экономии времени и / или памяти, в зависимости от значения a. В частности, значения от -128 до 127 кэшируются таким образом.

В большинстве случаев это не будет иметь существенного значения, поскольку Integer объекты являются неизменяемыми. Если вы создаете очень большое количество Integer объектов (значительно больше 256 из них) и большинство из них находятся между -128 и 127, ваш пример (1), вероятно, будет быстрее и будет использовать меньше памяти, чем (2) .

0 голосов
/ 18 мая 2010

Что происходит под капотом, так это то, что компилятор Java добавляет код, такой как Integer.valueOf (a), для преобразования значения int в объект.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...