Java 基础类型的包装类 Integer

纸上得来终觉浅,绝知此事要躬行。

上代码

		
        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]

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值