Integer包装类中值的比较
前提知识:“==”当比较基本类型时比较的是值,当为引用类型时比较的是内存地址
首先看代码和结果:
Integer integer1 = new Integer(1);
Integer integer2 = new Integer(1);
System.out.println("integer1 == integer2 :"+ (integer1 == integer2));
Integer integer3 = Integer.valueOf(1);
Integer integer4 = Integer.valueOf(1);
System.out.println("integer3 == integer4 :"+ (integer3 == integer4));
Integer integer5 = Integer.valueOf(128);
Integer integer6 = Integer.valueOf(128);
System.out.println("integer5 == integer6 :"+ (integer5 == integer6));
控制台输出:
解释:
第一个:因为new了嘛,所以就重新开辟了堆空间并且指向了不同的地址这里没啥说的
第二个和第三个这里就需要看源码了:
valueOf(int i)源码如下:
public static Integer valueOf(int i) {
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}
不用看太多,首先在if语句中先进行比较,当大于等于某个值和小于等于某个值的时候返回,否则在new一下(这里new一下当然就会有不同的指向),那么问题来了,这“两个值”是多少继续看源码:
/**
This method will always cache values in the range -128 to 127,
*/
就找到了这句话,综上可以理解为,当值-128 to 127时,不用创建爱你新的空间不用new当使用 “ == ”进行比较的时候同一个地址,所以true;
反之没在这个范围内就会创建新的空间并且有不同的指向,所以当用“==”比较时为false;
练习测试:
//示例一
Integer i1 = new Integer(127);
Integer i2 = new Integer(127);
System.out.println(i1 == i2);//F
//示例二
Integer i3 = new Integer(128);
Integer i4 = new Integer(128);
System.out.println(i3 == i4);//F
//示例三
Integer i5 = 127;//底层 Integer.valueOf(127)
Integer i6 = 127;//-128~127
System.out.println(i5 == i6); //T
//示例四
Integer i7 = 128;
Integer i8 = 128;
System.out.println(i7 == i8);//F
//示例五
Integer i9 = 127; //Integer.valueOf(127)
Integer i10 = new Integer(127);
System.out.println(i9 == i10);//F
//示例六
//只有有基本数据类型,判断的是值是否相同
Integer i11=127;
int i12=127;
System.out.println(i11==i12); //T
//示例七
//只有有基本数据类型,判断的是值是否相同
Integer i13=128;
int i14=128;
System.out.println(i13==i14);//T
结语:兄弟们加油哇!!