• Integer缓存策略


    先看一段代码

    1. @Test
    2. void contextLoads() {
    3. Integer a=10;
    4. Integer b=10;
    5. System.out.println(a==b); //true
    6. Integer c=1000;
    7. Integer d=1000;
    8. System.out.println(c==d); //false
    9. System.out.println(c.equals(d)); //true
    10. }

    对于两个非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=   来指定这个缓冲池的大小,该选项在 JVM 初始化的时候会设定一个名为 java.lang.IntegerCache.high 系统属性,然后 IntegerCache 初始化的时候就会读取该系统属性来决定上界

    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来实现数据缓存。

    • Byte类缓存范围:[-128,127] 共256个值。
    • Short类缓存范围:[-128,127] 共256个值。
    • Character类缓存范围:[0,127] 共128个值。
    • Integer类默认缓存范围:[-128,127] 共256个值,可以通过修改VM参数-XX:AutoBoxCacheMax=200 即可修改缓存上限到200
    • Long类缓存范围:[-128,127] 共256个值。
    • Boolean类就缓存两个值:true、false。

    具体内容请参考:解释一下自动装箱和自动拆箱?_学习使我可乐的博客-CSDN博客_自动装箱和自动拆箱

  • 相关阅读:
    PMP提分练习
    Kafka 消息队列 ( 五 ) 常见面试题
    运维困局下确保系统稳定的可行性
    咳嗽检测深度神经网络算法
    cookie + localStorage + sessionStorage
    一篇文章教你学会ASP.Net Core LINQ基本操作
    力扣(LeetCode)88. 合并两个有序数组(C++)
    算法 - 正方形数量
    mysql之GROUP_CONCAT
    flutter笔记-主要控件及布局
  • 原文地址:https://blog.csdn.net/m0_46845579/article/details/126191561