纸上得来终觉浅,绝知此事要躬行。
上代码
Integer i = new Integer(0);
Integer j = new Integer(0);
//false
// 分析 :new操作 都是在内存分配空间,创建对象,
//所以引用不同(地址不同),== 操作符就是直接比较变量存在的值
// 值有真正的值也有地址,但是都是二进制数字,所以看成数字的比较
boolean res = i == j;
Integer i1 = 0;
Integer j1 = 0;
//true 为什么相等?
res = i1 == j1;
为什么下面的相等的了咧, 代码做了什么?调试就知道了
Integer i1 = 0;
赋值运算是,先右到左,所以右边的 0 操作了什么(有点懵),用IDEA在赋值语句打断点,debug模式启动,点击 调试界面的【Force step into】(红色的下一步,不是蓝色的)按钮,程序进入Integer 类的 public static Integer 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);
}
方法中的 IntegerCache 是Integer的内部类,是个缓存类,缓存了-128 到 127 的数对应的Intebger实例,所以上面i1 和j1 都是用这个方法初始化的,0介于 [-128,127]之间,所以缓存的同一个实例,即存储的引用地址是一个数字,所以i1==j1为true;
可以去看看IntegerCache具体代码
为什么是[-128,127],这个就有趣了,可以看 IntegerCache 初始化cache代码,可以读[java.lang.Integer.IntegerCache.high]配置属性,和一个小算法;
Long类也有,可以都去看看,Long是固定缓存[-128,127]