Java中的Integer缓存池

这是我参与11月更文挑战的第8天,活动详情查看:2021最后一次更文挑战

写在前面

要说Java中有哪些比较有意思的基础知识点,那估计就可以说一下我们平时使用最多的整型数据类型中的缓存池了。

而今天我们要说的就是Integer中的缓存池,从这个缓存池就能大概能了解其他整型数据类型的缓存池了,大概实现原理都差不多的。

同时也告诉大家,基础知识非常重要,这些是我们的根基所在。

Integer中的缓存池

Integer缓存池第一次出现是在JDK5中,在目前适用最多的JDK8中也多了一些不一样的处理方式。

说起Integer缓存池的话,就必须先来做一道题,来看一下:

1
2
3
4
5
6
java复制代码Integer c1 = 1;
Integer c2 = 1;
Integer b1 = 130;
Integer b2 = 130;
System.out.println(c1 == c2);
System.out.println(b1 == b2);

这样的一道题,执行出来的结果是什么呢?

公布答案:

1
2
java复制代码true
false

这是为什么呢?明明是同样的方式去声明对象,返回的值却是不同的,这就需要缓存池的概念啦,先来看Integer类中的一个内部类,IntegerCache,源码如下图所示:

image.png

我虽然没有贴全源码,但是大家可以自行去源码中查看,养成看源码的意识,其实并不是什么太可怕的事情。

IntegerCache类中声明了一个cache[]数组,这个数组就是用来存储一些已经声明过的值。

但是又是什么样的值才能存入这个缓存数组中呢,那么就要更加仔细的看源码了。

不过我在这可以先和大家说一下答案,那就是在最新的JDK8中IntegerCache类的存储范围在-128到127之间,这也是在源码中通读一遍就能理解的。

就算因为对基础不够扎实,对源码的理解不到位,那么我们也可以从注释上看出来,如下图,这样也能知道其的范围。

image.png

本文转载自: 掘金

开发者博客 – 和开发相关的 这里全都有

0%