在写本节内容前,首先说明JDK1.5后增加的一个新特性:自动装箱和拆箱
Integer i5=127;
i5=i5+100;
System.out.println(i5);
输出结果为227
对于此段代码反编译后的代码为:
Integer i5 = Integer.valueOf(127); //自动装箱
i5 = Integer.valueOf(i5.intValue() + 100); //自动拆箱,再自动装箱
System.out.println((new StringBuilder("i5:")).append(i5).toString());
下面对比两段代码
Integer i1=new Integer(127);
Integer i2=new Integer(127);
System.out.println(i1==i2);
System.out.println(i1.equals(i2));
Integer i3=new Integer(128);
Integer i4=new Integer(128);
System.out.println(i3==i4);
System.out.println(i3.equals(i4));
输出结果为
false
true
false
true
i1,i2,i3,i4均为new的对象,存放在堆中,地址均不同,因此i1和i2,i3和i4均为false
第二段代码:
Integer i5=127;
Integer i6=127;
System.out.println(i5==i6);
System.out.println(i5.equals(i6));
Integer i7=128;
Integer i8=128;
System.out.println(i7==i8);
System.out.println(i7.equals(i8));
输出结果为:
false
false
false
true
看似一样的代码为什么产生了不同的结果?
由于自动装箱是调用的Integer的value方法,通过查看其源码:
public static Integer valueOf(int i) {
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
当符合i >= IntegerCache.low && i <= IntegerCache.high时返回IntegerCache.cache[i + (-IntegerCache.low)]
当不符合时返回new Integer(i)。
继续查看IntegerCache的源码,得到low为-128,high为127,即Integer的缓冲池大小为1个字节。
则当Integer直接赋值时,值-128到127之间时,创建的对象存放在常量池中,直接从常量池中获取数据。因此i6==i5为true。