Integer两种不同的赋值方式

前面说了String类型的赋值方式,那么数字类型呢?下面我就拿Integer解析:

 

先看下面一段代码:

 

如果看了前面的对String的讨论,可能大家会质疑c1 == c2的答案,但真实结果就是如此,为什么呢?

看看Debug出来的结果,c1、c2与d1、d2组合的Integer后面的id都是不同的,虽然我并不清楚这个id标志的是什么,但是id,字面意思就是身份标识,既然身份标识不一样,肯定不是同一个人了,最多就是同名的人罢了但是身份证(ID)永远是不同的。

 

 

 

再看看Integer对int的处理方法:

Integer.class -- valueOf(int i)

 

 

IntegerCache.class

 

所以对于c1 == c2 为 false我们也基本有了答案了,与String不同,JDK编译器在程序运行时就把某个范围的数字预编译放进缓冲区(在IntegerCache类中通过静态变量的方式声明,并初始化了值),而不是像String那样在第一次创建对象时创建相应的缓存,在第二次采用原型赋值方式时,就首先从缓冲区拿。

所以Integer num = value,当value不在-128~127这个范围区间时,他就通过new创建不同的对象;当value符合那个区间时,就从开始静态数组中(缓存区)拿,故不会产生新的对象。这估计也是JDK对于内存和效率权衡后确定的范围。

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值