Answers
这个问题反编译一下字节码就知道了:javap -verbose Test.java,可以看看main的方法体
public static void main(java.lang.String[]);
Code:
Stack=3, Locals=6, Args_size=1
0: ldc #2; //String key
2: astore_1
3: sipush 1000
6: invokestatic #3; //Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
9: astore_2
10: new #4; //class java/util/HashMap
13: dup
14: invokespecial #5; //Method java/util/HashMap."<init>":()V
注意看3:sipush 1000:把1000push到堆栈上,
关键在这里6:invokestatic #3//Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
这里用1000调用Integer.valueOf方法,也就是说最终放入map的是Integer.valueOf(1000)
再看看valueOf方法
public static Integer valueOf(int i) {
if(i >= -128 && i <= IntegerCache.high)
return IntegerCache.cache[i + 128];
else
return new Integer(i);
}
返回的是一个新的Integer,显然和传入的参数是不同的引用。
也就是说map.put(key, a);等同于map.put(key,Integer.valueOf(a))
人不猥琐枉少年
answered 12 years, 1 month ago