Узнайте о классах-оболочках Java, их использовании, преобразовании между примитивами и объектами, а также об автоматической упаковке и распаковке с примерами.
1. Классы-оболочки Java
В Java есть 8 примитивных типов данных. Java предоставляет оболочки типов, которые представляют собой классы, инкапсулирующие примитивный тип внутри объекта.
- Класс-обертка оборачивает(заключает) примитивный тип данных и придает ему вид объекта. Везде, где примитивный тип данных требуется как тип объекта, можно использовать эту обертку типа.
- Классы-обертки включают методы для распаковки объекта и возврата типа данных.
- Классы- оболочки типов являются частью пакета java.lang.
- Каждому примитивному типу соответствует класс-оболочка.
Примитивный тип | Класс-обертка |
---|---|
двойной | Двойной |
плавать | Плавать |
длинный | Длинный |
инт | Целое число |
короткий | Короткий |
байт | Байт |
чар | Характер |
булев | Булев |
2. Когда использовать классы-оболочки
Классы-оболочки Java используются в сценариях –
- Когда два метода хотят сослаться на один и тот же экземпляр примитивного типа, то передайте класс-оболочку в качестве аргументов метода.
- Java Generics работает только с объектными типами и не поддерживает примитивные типы.
- Коллекции Java работают только с объектами; чтобы сохранить примитивный тип в одном из этих классов, необходимо обернуть примитивный тип в класс.
- Когда вы хотите сослаться на null из типа данных, вам нужен объект. Примитивы не могут иметь null в качестве значения.
3. Конверсии
3.1 Преобразование примитивных типов в классы-оболочки
Существует два способа преобразования примитивного типа в экземпляр соответствующего класса-оболочки:
- Использование конструкторов
- Использование статических фабричных методов
// 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().
Автоматическая упаковка и распаковка позволяют разработчикам писать более чистый код, который легче читать.