欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-04-16 23:50:26
...

最近公众号老是看到这个小题,就大概知道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));
 }

结果:
源码解读:100 = 100 为true,1000 = 1000为false问题
Integer源码分析:
源码解读:100 = 100 为true,1000 = 1000为false问题

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对象

源码解读:100 = 100 为true,1000 = 1000为false问题
3、== 比较的是引用(引用类型),也就是对象在堆内存的物理地址,
a b 拿到同一个对象,地址值是相同的,所以a ==b 返回true
c d 拿到不通对象,在堆中物理地址是不同的,所以c == d 返回false

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

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