listofIntegers.add(ValueOf(50))之间的区别是什么?和listofIntegers.add(50);在Java中

时间:2018-01-14 16:09:47

标签: java arraylist autoboxing

这两个代码有什么区别:

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

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

它们都有相同的输出。

谢谢。

1 个答案:

答案 0 :(得分:21)

拳击转换隐含地使用Integer.valueOf,因此两者之间没有区别。

例如,请考虑以下代码:

public static void main(String[] args) {
    Integer x = 100;
    Integer y = Integer.valueOf(100);
}

该字节代码(如javap所示)是:

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

如您所见,这两段代码完全相同。

虽然language specification section on boxing并不保证valueOf会实现它,但确保保证有限的缓存:

  

如果框中的值p是评估类型booleancharshortint的常量表达式(第15.28节)的结果,or long,结果为true,false,包含'\ u0000'到'\ u007f'范围内的字符,或-128到127(含)范围内的整数,然后让a并且bp任意两次拳击转换的结果。始终是a == b

的情况

这与Integer.valueOf提供的保证相同。