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

6
这两段代码之间有什么区别呢:
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));

它们都有相同的输出。

谢谢。


3
同样的,您可以通过调用 Integer.valueOf(...) 显式地执行装箱操作。 - Alex
完全相同。编译器会将第一个转换为第二个。现在问一下当你调用 new Integer(666) 时会发生什么... - Boris the Spider
1个回答

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

如您所见,这两段代码是相同的。

尽管装箱相关的语言规范没有保证它将由 valueOf 实现,但它确实保证了有限的缓存:

如果被装箱的值 p 是一个类型为 booleancharshortintlong 的常量表达式(§15.28)的结果,并且结果为 true、false、包括 '\u0000' 到 '\u007f' 范围内的字符或包括 -128 到 127 范围内的整数之一,则令 ab 分别为 p 的任意两个装箱转换的结果。则始终有 a == b

这与Integer.valueOf所作出的保证相同。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接