Java中的Integer缓存问题,这么一看,真简单
编码之外
共 3264字,需浏览 7分钟
·
2021-08-15 13:11
先来看一个经典的问题,代码演示如下:
public static void main(String[] args) {
Integer a = 127;
Integer b = 127;
Integer c = 128;
Integer d = 128;
System.out.println(a == b);
System.out.println(c == d);
}
现在请你说出打印输出的结果是多少?
怎么样,答案是否和你想的一样呢?为什么会出现这样定位情况呢?
稍微思考一下,我们应该就能发现,问题肯定是出现在后面的赋值,像这种问题,一定是有没有特殊的情况,存在一个临界值,而127和128绝对和这个临界值有关,这是我们应该有的思考!
接下来我们就一步步的来分析这个问题!
揭开integer的缓存面纱
下面我们通过源码的方式去看下,为什么会存在上述问题,在说明这个问题之前,我想先带大家回顾一些基础知识:
一般来说,对于基础数据类型来说,“==”号就是用来比较两个数据是否相等,比较的就是字面值,但是对于引用数据类型来说,“==”号用来比较两个数据的对象地址是是否一样,而equals方法则是用来比较两个数据的字面值是否一致! Java中的数据基本分为基础数据类型和引用数据类型两大类
Integer a = 127;
Integer b = 127;
System.out.println(a == b);
如何返回缓存中的值
IntegerCache.cache[i + (-IntegerCache.low)]
缓存最大值的修改
-XX:AutoBoxCacheMax=<size>
-Djava.lang.Integer.IntegerCache.high=<value>
为什么缓存这个范围的值
举一反三,看看Short缓存问题
LOVE
点个在看你最好看
评论