源码解读: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));
}
结果:
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:感觉写的太墨迹了~~
上一篇: 北魏广陵王为什么要装哑?他是什么下场?
下一篇: Java学习Java入门