在讲解之前我们先来看一段代码:
Integer a = 1000, b = 1000;
Integer c = 100, d = 100;
System.out.println(a==b);
System.out.println(c==d);
相信大家都知道此时依次顺序输出为:false,true
那一定是这样的吗?
Integer a = 1000实际内部是调用Integer.valueOf(1000)方法,看下源码:
可以看出在i >= IntegerCache.low && i <= IntegerCache.high 时,会从IntegerCache.cache缓存里面拿,否则直接new Integer
看下IntegerCache内部实现:
从上面可以看出,low的默认值为-128,high的取值取决与integerCacheHighPropValue :
String integerCacheHighPropValue =
VM.getSavedProperty("java.lang.Integer.IntegerCache.high");
当我们未对jvm中的IntegerCache进行设置时,high默认值为:127,cache的数据也就是从-128到127。也就能理解为什么上面a==b为false,c==d为true。
接下来我们改一下jvm中的参数:
-XX:AutoBoxCacheMax=1024
这时候再运行,发现a==b也是等true。