这两个代码有什么区别:
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));
它们都有相同的输出。
谢谢。
答案 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
是评估类型boolean
,char
,short
,int
的常量表达式(第15.28节)的结果,or long
,结果为true,false,包含'\ u0000'到'\ u007f'范围内的字符,或-128到127(含)范围内的整数,然后让a
并且b
是p
任意两次拳击转换的结果。始终是a == b
。
这与Integer.valueOf
提供的保证相同。