Цикл статей «Учебник Java 8».
Следующая статья — «Java 8 ещё раз о перегрузке методов».
Предыдущая статья — «Java 8 строки».
Автоупаковка (autoboxing) — это автоматическая конвертация из примитивных типов в соответствующий этому типу класс-обёртку, вставляемая компилятором Java, например из float во Float , из int в Integer.
Примера автоупаковки:
1 2 3 4 |
Character ch = 'a'; Integer i1 = 220; Double d1 = 300.0; Boolean b1 = false; |
Компилятор Java применяет автоупаковку в следующих случаях:
- При передаче примитивного типа в параметр метода, ожидающего соответствующий ему класс-обёртку.
- При присвоении значения примитивного типа переменной соответствующего класса-обёртки.
Распаковка (unboxing) — конвертация класса-обёртки в соответствующий ему примитивный тип. В процессе распаковки может произойти исключение java.lang.NullPointerException , если значение переменной равно null.
Компилятор Java автоматически применяет распаковку в следующих случаях:
- При передаче объекта класса-обёртки в метод, ожидающий соответствующий примитивный тип.
- При присвоении экземпляра класса-обёртки переменной соответствующего примитивного типа.
- В выражениях, в которых один или оба аргумента являются экземплярами классов-обёрток (кроме операции == и != ).
Примеры:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
class Main { public static void method1(int x) { } public static void main(String[] args) { Integer i1 = 100; method1(i1); // распаковка Double d1 = 2.3; Double d2 = 3.3; double d3 = i1 + d1 + d2; // распаковка System.out.println(d3); } } |
Примитивный тип | Класс-обёртка | Упаковка | Распаковка |
---|---|---|---|
boolean | Boolean | Boolean.valueOf(booleanValue) | booleanObject.booleanValue() |
byte | Byte | Byte.valueOf(byteValue) | byteObject.byteValue() |
char | Character | Character.valueOf(charValue) | characterObject.charValue() |
float | Float | Float.valueOf(floatValue) | floatObject.floatValue() |
int | Integer | Integer.valueOf(integerValue) | integerObject.integerValue() |
long | Long | Long.valueOf(longValue) | longObject.longValue() |
short | Short | Short.valueOf(shortValue) | shortObject.shortValue() |
double | Double | Double.valueOf(doubleValue) | doubleObject.doubleValue() |
Если оба операнда являются классами-обёртками, то для операций сравнения < , > , <= , >= компилятор автоматически вставляет распаковку, но в случае операций == и != происходит сравнение ссылок объектов.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
Integer x = 10; Integer y = 20; System.out.println("x > y : " + (x > y)); // false System.out.println("x < y : " + (x < y)); // true Integer x1 = new Integer(10); Integer x2 = new Integer(10); // x1 и x2 ссылаются на разные экземпляры объектов System.out.println("x1 >= x2 : " + (x1 >= x2)); //true System.out.println("x1 <= x2 : " + (x1 <= x2)); //true System.out.println("x1 == x2 : " + (x1 == x2)); //false происходит // сравнение ссылок System.out.println("x1 != x2 : " + (x1 != x2)); // true происходит // сравнение ссылок Integer x3 = Integer.valueOf(10); Integer x4 = 10; // Здесь неявно вызывается Integer.valueOf // Теперь x3 и x4 указывают на один и тот же объект из-за кэширования. System.out.println("x3 == x4 : " + (x3 == x4)); // true из-за кэширования // см. метод Integer.valueOf System.out.println("x3 != x4 : " + (x3 != x4)); // false из-за кэширования // см. метод Integer.valueOf |
Цикл статей «Учебник Java 8».
Следующая статья — «Java 8 ещё раз о перегрузке методов».
Предыдущая статья — «Java 8 строки».