本文将介绍Java中Integer的缓存相关知识。这是在Java 5中引入的一个有助于节省内存、提高性能的功能。首先看一个使用Integer的示例代码,从中学习其缓存行为。接着我们将为什么这么实现以及他到底是如何实现的。你能猜出下面的Java程序的输出结果吗。如果你的结果和真正结果不一样,那么你就要好好看看本文了。
执行结果上述代码执行结果如上图。
在Integer的操作上,jdk引入了缓存的实现来提高性能节省内存,复用了-128到127区间的Integer。
对于Integer i = 0这种赋值语句,Java的编译器把基本数据类型自动转换成封装类对象的过程叫做自动装箱,相当于使用valueOf方法。
我们看一下valueOf方法源码
可以看到如果i在-128-127(默认127,可以通过XX:AutoBoxCacheMax=size参数修改)数值区间内,valueOf会直接返回缓存结果。
IntegerCache是Integer底下的一个静态内部类,IntegerCache内部维护了一个Integer数据,与两个int属性(低位和高位)。
在static代码块中,会循环实例化cache数组中的Integer对象,完成缓存的初始化工作。
为什么选择-128到127这个范围呢?因为这个范围的数字是最被广泛使用的。
下面贴一段 Java Integer Cache 文档的译文(译文来自Hollis):
网友评论