Java: Autoboxing and unboxing
If a value of primitive type (int
, double
, boolean
, …) is provided where a value of wrapper type (a “boxed value” such as Integer
, Double
, Boolean
, …) is expected, the compiler will automatically convert it. This is called autoboxing.
Example: Autoboxing in its simplest form
Integer i = 5; // int turned into an Integer
The opposite conversion is called unboxing.
Example: Unboxing in its simplest form
int i = new Integer(5); // Integer turned into an int
Without these automatic conversions, code would quickly get cluttered, especially when working with collections.
Unboxing a null reference
If you try to unbox a null
reference, a NullPointerException
will be thrown.
Example: Compiles but throws a NullPointerException
when executed
Integer i = null;
int j = i;
Behind the scenes
The Java Language Specification does not specify exactly how the conversion should be done, but the javac
reference implementation uses the following methods:
Type | Boxing | Unboxing |
---|---|---|
|
Byte.valueOf
|
Byte.byteValue
|
|
Short.valueOf
|
Short.shortValue
|
|
Integer.valueOf
|
Integer.intValue
|
|
Long.valueOf
|
Long.longValue
|
|
Float.valueOf
|
Float.floatValue
|
|
Double.valueOf
|
Double.doubleValue
|
|
Character.valueOf
|
Character.charValue
|
|
Boolean.valueOf
|
Boolean.booleanValue
|
Example: These two snippets are equivalent
Caching
The valueOf
methods of Byte
, Short
, Integer
, Long
and Character
caches values between −128 and 127. This means that two calls to Integer.valueOf(5)
will return the same reference, while two calls to Integer.valueOf(5000)
may not.
This can give rise to some surprising semantics when comparing boxed values using ==
and !=
.
Recommended reading: Java: Boxed values and equality.