Автобоксинг: я могу написать: Integer я = 0; вместо: Integer я = new Integer (0);

Автобоксирование, похоже, сводится к тому, что я могу написать:

Integer i = 0; 

вместо:

Integer i = new Integer(0);

Таким образом, компилятор может автоматически преобразовать примитив в объект.

Это идея? Почему это важно?

Ответ 1

Вы немного упростили это.

Автобоксинг также входит в игру при использовании коллекций. Как объясняется в sun java docs:

Коллекции могут содержать только ссылки на объекты, поэтому вам нужно вставить примитивные значения в соответствующий класс-оболочку. ... Когда вы вынимаете объект из коллекции, вы получаете Integer, который вы вставляете; если вам нужен int, вы должны распаковать Integer, используя метод intValue. Весь этот бокс и unboxing - это боль и загромождает ваш код. Функция автобоксинга и распаковки автоматизирует процесс, устраняя боль и беспорядок.

Итак, когда вы должны использовать autoboxing и unboxing? Используйте их только при наличии "несоответствия импеданса" между ссылочными типами и примитивами, например, когда вам нужно ввести числовые значения в коллекцию. Нецелесообразно использовать автобоксинг и распаковку для научных вычислений или другой высокопроизводительный численный код. Целое число не является заменой int; autoboxing и unboxing размывают различие между примитивными типами и ссылочными типами, но они не устраняют его.

Отличный обзор Autoboxing

Ответ 2

Кстати

Integer i = 0;

эквивалентно

Integer i = Integer.valueOf(0);

Различие заключается в том, что valueOf() не создает новый объект для значений между -128 и 127 (по-видимому, это будет настраиваться, если Java 6u14)

Ответ 3

Он существует, чтобы вы могли писать код типа

List<Integer> is = new ArrayList<Integer>();
is.add(1); // auto-boxing
is.add(2);
is.add(3);

int sum = 0;
for (int i : is)  // auto-unboxing
{
    sum += i;
}

Для одиночных целых чисел по умолчанию следует использовать тип int, а не Integer. Целое в основном используется в коллекциях.

Остерегайтесь того, что Long отличается от того же значения, что и Integer (с использованием equals()), но как долго он равен int (используя ==).

Ответ 4

Это идея, да. Тем не менее, еще удобнее назначить Integer для int.

Можно утверждать, что autoboxing рассматривает симптом, а не причину. Существенным источником путаницы является то, что система типов Java непоследовательна: необходимость как примитивов, так и ссылок на объекты является искусственной и неудобной. Автобоксинг несколько смягчает это.

Ответ 5

Делает более читаемый и более чистый код. Особенно, если вы выполняете операции (поскольку Java не имеет перегрузки оператора).

Ответ 6

С моей циничной шляпой: для подбора ограничений на оригинальную Java (я имею в виду Oak здесь) spec. Не только в первый раз.

Ответ 7

Из того, что я помню, когда читал Joshua Bloch Effective Java, вы должны рассмотреть примитивы над своими коробочными коллегами. Автобоксирование без учета его побочных эффектов может вызвать проблемы.

Ответ 8

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

Ответ 9

Основным преимуществом было бы читаемость, синтаксический сахар в основном. Java уже очень многословна, Sun пытается использовать всевозможные способы сокращения синтаксиса.