The boxing conversion uses Integer.valueOf
implicitly, so there's no difference between the two.
For example, consider this code:
public static void main(String[] args) {
Integer x = 100;
Integer y = Integer.valueOf(100);
}
The byte code for that (as shown by javap
) is:
public static void main(java.lang.String[]);
Code:
0: bipush 100
2: invokestatic #2 // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
5: astore_1
6: bipush 100
8: invokestatic #2 // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
11: astore_2
12: return
As you can see, the two pieces of code are identical.
Although the language specification section on boxing doesn't guarantee that it will be implemented by valueOf
, it does guarantee limited caching:
If the value p
being boxed is the result of evaluating a constant expression (§15.28) of type boolean
, char
, short
, int
, or long
, and the result is true, false, a character in the range '\u0000' to '\u007f' inclusive, or an integer in the range -128 to 127 inclusive, then let a
and b
be the results of any two boxing conversions of p
. It is always the case that a == b
.
This is the same guarantee made by Integer.valueOf
.
Integer.valueOf(...)
– Venalnew Integer(666)
... – Carvelbuilt