2016-03-14 2 views
0

У меня здесь очень глупый вопрос. Когда мы добавим значение int в ArrayList, будет ли он создавать новый объект Integer этого значения int? Например:При добавлении целого числа в ArrayList

int a = 1; 
ArrayList<Integer> list = new ArrayList<Integer>(); 
list.add(a); 

В приведенном выше коде, «а» представляет собой примитивный тип, который имеет значение 1, «список» представляет собой ArrayList, который содержит элементы типа Integer. Поэтому, добавляя «a» в «list», как «list» обрабатывает «a» как целое?

+2

[Autoboxing] (https://docs.oracle.com/javase/tutorial/java/data/autoboxing.html) –

ответ

0

a является autoboxed до Integer. По этой ссылке,

Autoboxing является автоматическое преобразование, что компилятор Java делает между примитивными типами и их соответствующий объект класса-оболочки.

+0

, поэтому компилятор создаст новый объект в куче, который не имеет никакого отношения к переменной a , это правильно? – gimbup

+0

Независимо от того, создан ли новый объект (должен быть кеш для значений в диапазоне 'byte'), [' intValue() '] (https://docs.oracle.com/javase/8/docs /api/java/lang/Integer.html#intValue--) будет равно 'a', поэтому они ** связаны **. И, если unboxed, то значение также будет равно 'a'. –

0

ли создан новый объект Integer зависит от значения, если int добавляется. В JVM есть кеш готовых объектов, охватывающих ряд общих значений, и если значение находится в этом диапазоне, он будет использовать существующий кешированный объект вместо создания нового.

Для типа int, the Java language specification требует, чтобы этот кеш охватывал все номера от -128 до 127 (включительно). Реализация JVM может включать или не включать дополнительные значения в этот кеш по своему усмотрению.

+0

Спасибо за ваш ответ – gimbup

0

В

int a = 1; 
ArrayList<Integer> list = new ArrayList<Integer>(); 
list.add(a); 

последняя строка автоматически преобразуется компилятором в:

list.add(Integer.valueOf(a)); 

Integer.valueOf это метод, который либо создает новый Integer объект с тем же значением, или повторно использует тот, который уже существует. Полученный объект не имеет отношения к переменной a, за исключением того, что он представляет одно и то же значение.

+0

Спасибо, что ответили, что помогает мне понять – gimbup