Классы-оболочки Java, автоупаковка и распаковка

Узнайте о классах-оболочках Java, их использовании, преобразовании между примитивами и объектами, а также об автоматической упаковке и распаковке с примерами.

1. Классы-оболочки Java

В Java есть 8 примитивных типов данных. Java предоставляет оболочки типов, которые представляют собой классы, инкапсулирующие примитивный тип внутри объекта.

  • Класс-обертка оборачивает(заключает) примитивный тип данных и придает ему вид объекта. Везде, где примитивный тип данных требуется как тип объекта, можно использовать эту обертку типа.
  • Классы-обертки включают методы для распаковки объекта и возврата типа данных.
  • Классы- оболочки типов являются частью пакета java.lang.
  • Каждому примитивному типу соответствует класс-оболочка.
Примитивный тип Класс-обертка
двойной Двойной
плавать Плавать
длинный Длинный
инт Целое число
короткий Короткий
байт Байт
чар Характер
булев Булев

2. Когда использовать классы-оболочки

Классы-оболочки Java используются в сценариях –

  • Когда два метода хотят сослаться на один и тот же экземпляр примитивного типа, то передайте класс-оболочку в качестве аргументов метода.
  • Java Generics работает только с объектными типами и не поддерживает примитивные типы.
  • Коллекции Java работают только с объектами; чтобы сохранить примитивный тип в одном из этих классов, необходимо обернуть примитивный тип в класс.
  • Когда вы хотите сослаться на null из типа данных, вам нужен объект. Примитивы не могут иметь null в качестве значения.

3. Конверсии

3.1 Преобразование примитивных типов в классы-оболочки

Существует два способа преобразования примитивного типа в экземпляр соответствующего класса-оболочки:

  1. Использование конструкторов
  2. Использование статических фабричных методов
// 1. using constructorInteger object = new Integer(10);// 2. using static factory methodInteger anotherObject = Integer.valueOf(10);

В приведенном выше примере метод valueOf() является статическим фабричным методом, который возвращает экземпляр класса Integer, представляющий указанное значение int.

Аналогичным образом мы можем преобразовать другие примитивные типы, такие как boolean в Boolean, char в Character, short в Short и т. д.

Классы-обертки Java используют внутреннее кэширование, которое возвращает внутренне кэшированные значения до предела. Это внутреннее кэширование экземпляров делает классы-обертки более эффективными в производительности и унификации памяти.

3.2 Преобразование класса-обертки в примитивный тип

Преобразование из класса-обертки в примитивный тип простое. Мы можем использовать соответствующие методы экземпляра для получения примитивного типа. например, intValue(), doubleValue(), shortValue() и т. д.

Integer object = new Integer(10);int val = object.intValue(); //wrapper to primitive

4. Автоупаковка и распаковка

Начиная с JDK 5, в Java добавлены две важные функции:

  • Автобоксинг
  • Автоматическая распаковка

4.1. Автобоксинг

Автоупаковка — это автоматическое преобразование примитивных типов в соответствующий им класс-оболочку.

Например, преобразование int в Integer, char в Character и т. д.

Мы можем просто передать или присвоить примитивный тип аргументу или ссылке, принимающей тип класса-оболочки.

Пример автобоксинга Java

 List<Integer> integerList = new ArrayList<>();for(int i = 1; i < 10; i ++){integerList.add(i); //int to Integer}

В данном примере integerList — это список целых чисел. Это не список значений примитивного типа int.

Здесь компилятор автоматически создает объект Integer из int и добавляет объект в integerList. Таким образом, предыдущий код превращается в следующий во время выполнения:

List<Integer> integerList = new ArrayList<>();for(int i = 1; i < 10; i ++){integerList.add(Integer.valueOf(i)); //autoboxing}

4.2 Распаковка

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

Пример распаковки Java

public static int sumOfEven(List<Integer> integerList){int sum = 0;for(Integer i: integerList) {if(i % 2 == 0)sum += i; //Integer to int}return sum;}

В приведенном выше примере операторы остатка(%) и унарного плюса(+=) не применяются к объектам Integer. Компилятор автоматически преобразует Integer в int во время выполнения, вызывая метод intValue().

Автоматическая упаковка и распаковка позволяют разработчикам писать более чистый код, который легче читать.

Прокрутить вверх