除了Float 和 Double 外,其他包装数据类型都会缓存 -128 ~127 的值,对于 Integer var = ? 在 -127~128 之间的赋值,Integer 对像由IntegerCache.cache 产生,会复用已有对像,这个区间内的Integer 值可以直接使用 == 判断,但是这个区间外的所有数据都会在堆上产生,并不会复用已有对像。
源码:
public static Integer valueOf(int var0) {
return var0 >= -128 && var0 <= Integer.IntegerCache.high ? Integer.IntegerCache.cache[var0 + 128] : new Integer(var0);
}
在JDK9直接把new的构造方法过时,推荐使用valueOf ,利用缓存提升性能。
Integer 是唯一可修改缓存范围的包装类,在vm options 加入参数 -XX:autoBoxCacheMax=7777,即可设置最大缓存值为7777。
摘自:《码出高效》