Java的Integer缓存池用法

 更新时间:2025年02月07日 11:01:35   作者:空说  
Java的Integer缓存池主要为了提升性能和节省内存,它缓存了-128到127范围内的Integer对象,因此这些对象在比较时会直接比较引用,而不是值,其他包装类如Byte、Short、Character也有类似的缓存池

Java的Integer缓冲池?

Integer 缓存池主要为了提升性能和节省内存。根据实践发现大部分的数据操作都集中在值比较小的范围,因此缓存这些对象可以减少内存分配和垃圾回收的负担,提升性能。

在-128到 127范围内的 Integer 对象会被缓存和复用。

原理

int 在自动装箱的时候会调用Integer.valueOf,进而用到了 IntegerCache。

@HotSpotIntrinsicCandidate
public static Integer value0f(int i){
    if(i>= IntegerCache.low && i<= IntegerCache.high)  //如果传入的int值在缓存范围内,则直接从缓存中返回Integer对象
        return IntegerCache.cache[i+(-IntegerCache.low)];
    return new Integer(i);                              //否则,创建新的Integer对象
}
private static class IntegerCache{
    static final int low=-128;
    static final int high;
    static final Integer cache[];
    static {
        // high value may be configured by property
        int h = 127;
        String integerCacheHighPropValue = VM.getSavedProperty( key:"java.lang.Integer.IntegerCache.high");
        if(integerCacheHighPropValue != null){
            try {
                int i = parseInt(integerCacheHighPropValue);
                i = Math.max(i,127);
                // Maximum array size is Integer.MAX_VALUE
                h= Math.min(i,Integer.MAX_VALUE-(-low)-1);
            }catch( NumberFormatException nfe){
            //If the property cannot be parsed into an int, ignore it.
            }
        }
        high = h;
        
        cache =new Integer[(high-low)+1];
        int i = low;
        for(int k=0;k< cache.length; k++)    //遍历创建-128-127的所有对象
            cache[k]= new Integer(i++);
        assert IntegerCache.high >= 127;
    }
    
    private IntegerCache(){}
}

所以这里还有个面试题:就是为啥 Integer 127 之内的相等,而超过 127 的就不等了?

因为小于等于127的 Integer 对象是从同一个缓存池中获取的,它们指向的是相同的对象实例,所以它们的引用相等

不仅 Integer 有,Long 同样有一个缓存池,不过范围是写死的 -128 到 127,不能通过JVM参数进行调整

@HotSpotIntrinsicCandidate
public static Long value0f(long l){
    final int offset = 128;
    if(l>= -128 &&l<= 127){ // will cache
        return LongCache.cache[(int)l + offsetl];
    }
    return new Long(l);
}

总结

  • Byte,Short,Integer,Long这4种包装类默认创建了数值[-128,127]的相应类型的缓存数据
  • Character 创建了数值在 [0,127]范围的缓存数据
  • Boolean 直接返回 True or False
  • Float 和 Double 没有缓存数据,毕竟是小数,能存的数太多了

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • SpringBoot根据目录结构自动生成路由前缀的实现代码

    SpringBoot根据目录结构自动生成路由前缀的实现代码

    本文介绍如何根据目录结构给RequestMapping添加路由前缀,具体实现方法,本文通过示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2021-08-08
  • Java面向对象的三大特征

    Java面向对象的三大特征

    这篇文章主要给大家结合相关示例介绍了Java面向对象的三大特征:封装、继承、多态,非常的实用,有需要的小伙伴可以参考下。
    2015-06-06
  • JavaSE实现文件压缩与解压缩的技巧分享

    JavaSE实现文件压缩与解压缩的技巧分享

    我们在日常实际开发中,对于文件压缩和解压缩场景,是非常常见的操作,本文详细介绍JavaSE中文件压缩和解压缩的实现方法,包括源代码解析、应用场景案例、优缺点分析、案例演示、文末总结等等,请同学们耐心阅读
    2024-03-03
  • java实现获取网站的keywords,description

    java实现获取网站的keywords,description

    这篇文章主要介绍了java实现获取网站的keywords,description的相关资料,需要的朋友可以参考下
    2015-03-03
  • Struts2学习笔记(9)-Result配置全局结果集

    Struts2学习笔记(9)-Result配置全局结果集

    这篇文章主要介绍Struts2中使用Result配置全局结果集的方法,希望能给大家做一个参考。
    2016-06-06
  • BootStrap Jstree 树形菜单的增删改查的实现源码

    BootStrap Jstree 树形菜单的增删改查的实现源码

    这篇文章主要介绍了BootStrap Jstree 树形菜单的增删改查的实现源码,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2017-02-02
  • Java报错:FileNotFoundException的解决方案

    Java报错:FileNotFoundException的解决方案

    在Java编程中,FileNotFoundException 是一种常见的受检异常,通常发生在试图打开一个不存在的文件或文件路径错误时,本文将详细探讨FileNotFoundException的成因、解决方案以及预防措施,帮助开发者理解和避免此类问题,需要的朋友可以参考下
    2024-06-06
  • SpringMVC的最小化配置说明

    SpringMVC的最小化配置说明

    这篇文章主要介绍了SpringMVC的最小化配置说明,Spring MVC是一个基于Java的Web框架,用于构建灵活、高效的Web应用程序,它采用了MVC的设计模式,将应用程序的逻辑分为模型、视图和控制器三个部分,以实现代码的分离和重用,需要的朋友可以参考下
    2023-10-10
  • 一篇文章带你了解Java SpringBoot四大核心组件

    一篇文章带你了解Java SpringBoot四大核心组件

    这篇文章主要介绍了SpringBoot四大核心组件的使用小结,详细的介绍了这方面的知识,有兴趣的可以了解一下,希望能够给你带来帮助
    2021-09-09
  • Java中常用的五种List声明并赋值操作方式

    Java中常用的五种List声明并赋值操作方式

    在Java编程中经常会使用到集合类来存储和操作多个元素,List是一种常见的集合类,它允许存储重复的元素,并且保持元素的插入顺序,这篇文章主要给大家介绍了关于Java中常用的五种List声明并赋值操作的相关资料,需要的朋友可以参考下
    2024-02-02

最新评论