Быстрый автобокс / авто-распаковка вопрос в Java - PullRequest
0 голосов
/ 15 октября 2018

Я только что познакомился с концепцией автобокса в Java, и у меня есть пара быстрых вопросов, которые помогут мне прояснить мое понимание.Из того, что я понимаю, является то, что когда мы объявляем массив, такой как

ArrayList<Integer> myList = new ArrayList<Integer>();

, мы все равно можем помещать примитивные целые числа внутрь myList, так как примитив будет автоматически заключен в объект Integer.Я предполагаю, что это означает, что если бы я попытался добавить объект Integer в этот ArrayList, не было бы никакого автобокса, так как я добавляю «правильный» тип?Другими словами, я предполагаю, что команда

myList.add(new Integer(2));

не использует автобокс.Точно так же я предполагаю, что для извлечения элементов из этого ArrayList и их сохранения в их обертках не требуется автобокс, так как я не помещаю их в их примитивы?Ака:

Integer a = myList.get(0);

не распаковывает?Из того, что я понимаю, распаковка произойдет, когда я попытаюсь смешать примитивы с рисунком:

int b = 4;
Integer c = a + b;

В такой ситуации я думаю, что автоматическая распаковка воли будет происходить в примитив int, добавьте с помощью int bа затем сам бокс в целочисленный объект?Мое понимание на правильном пути?

1 Ответ

0 голосов
/ 15 октября 2018

Ваше понимание верно.

Люди, начинающие путать Integer и int, когда автобокс был введен в Java 5 в 2004 году. До этого вам приходилось явно устанавливать и снимать флажки.Автобокс имеет преимущества более лаконичного кода, но также имеет и недостатки, заключающиеся в том, что некоторые начинающие программисты не совсем точно понимают, что происходит, и невольно пишут код, который без необходимости упаковывает и распаковывает.

Кстати, ваш пример new Integer(2) лучшезакодировано как Integer.valueOf(2).Последний будет использовать кэшированный объект вместо создания нового.

...