Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

What is difference between of listofIntegers.add(ValueOf(50)); and listofIntegers.add(50); in Java

What is the difference between these 2 codes:

Arraylist<Integer> listofIntegers = new Arraylist<Integer>();
listofIntegers.add(666);
System.out.println("First Element of listofIntegers = " + listofIntegers.get(0));

And

Arraylist<Integer> listofIntegers = new Arraylist<Integer>();
listofIntegers.add(Integer.ValueOf(666));
System.out.println("First Element of listofIntegers = " + listofIntegers.get(0));

Both of them have the same output.

Thank you.

like image 822
Amirreza Yegane Avatar asked Jan 14 '18 16:01

Amirreza Yegane


1 Answers

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.

like image 178
Jon Skeet Avatar answered Nov 14 '22 22:11

Jon Skeet