一个关于java的封装类自增问题


下面的一段代码,大家认为输出是什么?为什么?

   
  String key = "key";
  
Integer a = 1000;
Map<String, Integer> map = new HashMap<String, Integer>();
map.put(key, a);
a++;
System.out.println(a);
System.out.println(map.get(key));

java 讨论

痴然若醉丶 12 years, 1 month ago

这个问题反编译一下字节码就知道了: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

Your Answer