先看一段代码
- @Test
- void contextLoads() {
- Integer a=10;
- Integer b=10;
- System.out.println(a==b); //true
-
- Integer c=1000;
- Integer d=1000;
- System.out.println(c==d); //false
- System.out.println(c.equals(d)); //true
-
- }
对于两个非new生成的Integer对象,进行比较时,如果两个变量的值在区间-128到127之间,则比较结果为true,如果两个变量的值不在此区间,则比较结果为false。
当值在 -128 ~ 127之间时,java会进行自动装箱,然后会对值进行缓存,如果下次再有相同的值,会直接在缓存中取出使用。缓存是通过Integer的内部类IntegerCache来完成的。当值超出此范围,会在堆中new出一个对象来存储。


给一个Integer对象赋一个int值的时候,会调用Integer类的静态方法valueOf()。
我们也可以注意到在源码中,IntegerCache的low和high虽然都是final修饰的,但是final没有赋初值,也就是我们可以去自定义的。
在 jdk 1.8 所有的数值类缓冲池中,Integer 的缓冲池 IntegerCache 很特殊,这个缓冲池的下界是 - 128,上界默认是 127,但是这个上界是可调的,在启动 jvm 的时候,通过
-XX:AutoBoxCacheMax=
Idea2021.3.2 设置项目运行参数配置_hnjcxy的博客-CSDN博客_idea添加运行配置
而包装类并不是都有缓存的,例如Double和Float就没有
Java中基本数据类型byte、short、char、int、long、float、double、boolean有对应的封装类型:Byte、Short、Character、Integer、long、Float、Double,Boolean其中Byte、Short、Character、Integer、Long、Boolean都实现了常量池缓存。Byte、Short、Character、Integer、Long通过静态内部Cache类来实现一定范围(下面列出缓存范围)内的数据缓存,而Boolean通过两个静态常量TRUE、FALSE来实现数据缓存。