先看一下Integer的原码
public static Integer valueOf(int i) {
assert IntegerCache.high >= 127;
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}
从jdk1.5开始,有“自动装箱”这么一个机制,在byte-128到127范围内(ps整型的八位二进制的表示的范围为-128到127),如果存在了一个值,再创建相同值的时候就不会重新创建,而是引用原来那个,用==来比较时,是同一个对象
但是超过byte范围还是会新建的对象new Integer(),那么用==来比较时,地址是不等的
Integer i1=new Integer(128);
int i2=128;
//经历拆箱过程将i1对象变为int i1=128;所以为true
System.out.println("---new Integer与int---"+(i1==i2));
Integer i3=new Integer(128);
//两个都是new。。两个对象间的比较,比较的是地址,所以为false
System.out.println("---new Integer与new Integer---"+(i1==(i3)));
Integer i4=128;
Integer i44=127;
//不会经历拆箱过程,i3的引用指向堆,而i4指向专门存放他的内存(常量池),他们的内存地址不一样,所以为false
System.out.println("---new Integer与Integer---"+(i3==i4));
Integer i5=128;
Integer i55=127;
//Integer与Integer间的比较,自动装箱过程,超过范围则创建新对象
System.out.println("---Integer为128与Integer为128---"+(i4==i5));
System.out.println("---Integer为127与Integer为127---"+(i44==i55));
|