源码解读:100 = 100 为true,1000 = 1000为false问题

最近公众号老是看到这个小题,就大概知道Integer是有个缓存【-128,127】,今天我们来研究下

测试代码:

 public static void main(String[] args) {
      Integer a = 100,b = 100;
      Integer c = 1000,d = 1000;
      System.out.println("100 = 100 结果为:"+(a == b));
      System.out.println("1000 = 1000 结果为:"+(c == d));
 }

结果:
在这里插入图片描述
Integer源码分析:
在这里插入图片描述

1、可以看到,Integer类有个静态内部类IntegerCache,仨属性,low,high 缓存最小、最大值,存放Integer类的cache[]数组,
静态代码块给数组赋值,从low(-128)开始,到high(127)结束

2、从Integer a = 100,b = 100;打个断点debug启,可以看到:
声明变量,赋值,调的valueOf()方法,赋值100在【-128,127】之间,直接返回cache数组中对象,所以变量a b拿到得是同一个Integer对象

Integer a = 1000,b = 1000;

执行到这句,赋值1000不在【-128,127】之间,返回新new的Integer对象,
所以c d 拿到的是两个值为1000的Interger对象

在这里插入图片描述
3、== 比较的是引用(引用类型),也就是对象在堆内存的物理地址,
a b 拿到同一个对象,地址值是相同的,所以a ==b 返回true
c d 拿到不通对象,在堆中物理地址是不同的,所以c == d 返回false

引用类型对象在堆内存存放情况请参考这篇~

tip:感觉写的太墨迹了~~

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值