首页 > 编程语言 >一文读懂Java缓存池:从基础到高级应用

一文读懂Java缓存池:从基础到高级应用

时间:2023-09-17 11:01:17浏览次数:38  
标签:缓存 Java int valueOf 读懂 123 new Integer

一文读懂Java缓存池:从基础到高级应用_System

什么是缓存池

Java缓存池是一种用于管理缓存数据的机制,它提供了一种高效的方式来存储和获取数据。缓存池的作用是减少对外部资源的访问次数,提高系统的性能和响应速度。

实例说明

new Integer(123) 与 Integer.valueOf(123) 的区别在于:

  • new Integer(123) 每次都会新建一个对象
  • Integer.valueOf(123) 会使用缓存池中的对象,多次调用会取得同一个对象的引用。
Integer x = new Integer(123);
Integer y = new Integer(123);
System.out.println(x == y);    // false
Integer z = Integer.valueOf(123);
Integer k = Integer.valueOf(123);
System.out.println(z == k);   // true

valueOf() 方法的实现比较简单,就是先判断值是否在缓存池中,如果在的话就直接返回缓存池的内容。

public static Integer valueOf(int i) {
    if (i >= IntegerCache.low && i <= IntegerCache.high)
        return IntegerCache.cache[i + (-IntegerCache.low)];
    return new Integer(i);
}

在 Java 8 中,Integer 缓存池的大小默认为 -128~127。

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 =
        sun.misc.VM.getSavedProperty("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 j = low;
    for(int k = 0; k < cache.length; k++)
        cache[k] = new Integer(j++);

    // range [-128, 127] must be interned (JLS7 5.1.7)
    assert IntegerCache.high >= 127;
}

编译器会在缓冲池范围内的基本类型自动装箱过程调用 valueOf() 方法,因此多个 Integer 实例使用自动装箱来创建并且值相同,那么就会引用相同的对象。

Integer m = 123;
Integer n = 123;
System.out.println(m == n); // true

基本类型对应的缓冲池如下:

  • boolean values true and false
  • all byte values
  • short values between -128 and 127
  • int values between -128 and 127
  • char in the range \u0000 to \u007F

在使用这些基本类型对应的包装类型时,就可以直接使用缓冲池中的对象。

如果在缓冲池之外:

Integer m = 323;
Integer n = 323;
System.out.println(m == n); // false

标签:缓存,Java,int,valueOf,读懂,123,new,Integer
From: https://blog.51cto.com/u_16228679/7500130

相关文章

  • 马士兵JAVA自学之路
    为了就业,不少同学参加各种各样的培训。决心做软件的,大多数人选的是java,或是.net,也有一些选择了手机、嵌入式、游戏、3G、测试等。那么究竟应该选择什么方向呢?我的意见是,不要太过相信各种培训机构或是抢手文章的说法(包括我),当你要走向社会的时候,就不要再把自己当成学生,不要把自......
  • JAVA17/JAVA21方法精讲
    day05_java基础课程目标1.【理解】什么是方法2.【掌握】方法的格式3.【理解】方法的执行流程4.【掌握】方法的案例5.【理解】方法的重载6.【理解】方法参数的传递方法概述什么是方法方法(method)完成某一个特定功能的代码块方法基本使用将资料中给大家提供的打......
  • windows path及java path
    原理:在cmd敲击下的命令直接从path中去找,找不到的设置path即可1执行命令2直接将路径敲全3环境变量path是由系统和用户变量的path叠加的,如果一个执行的命令路径在系统用户和用户变量中均存在,以系统变量为准......
  • 无涯教程-JavaScript - CEILING.MATH函数
    描述CEILING.MATH函数将数字四舍五入到最接近的整数或最接近的有效倍数。ExcelCEILING.MATH函数是Excel中的十五个舍入函数之一。语法CEILING.MATH(number,[significance],[mode])争论Argument描述Required/OptionalNumberNumbermustbelessthan9.99E+307an......
  • mybatis jdbc java 字段类型转换
    在springmvc+mybatis+mysql数据表CREATETABLE`test_jdbc_java_type`(`id`int(11)NOTNULL,`_char`char(50)DEFAULTNULL,`_varchar`varchar(200)DEFAULTNULL,`_numeric`decimal(10,2)DEFAULTNULL,`_decimal`decimal(10,2)DEFAULTNULL,`_b......
  • 一文读懂ref函数:从入门到精通的具体操作指南
    什么是ref函数Vue3中的ref函数是一个用于创建响应式数据的函数。在Vue3中,当组件渲染时,会生成一个响应式数据对象,该对象包含了组件实例的所有数据属性。使用ref函数可以创建一个响应式的数据对象,并且可以在组件的生命周期内进行读取和修改。具体来说,ref函数接受一个初始值作为参数,并......
  • JAVA反射(一)获取Class对象的三种方式及其区别
    publicclassClassModel{static{System.out.println("staticblock");}{System.out.println("dynamicblock");}}publicclassClassTest{publicstaticvoidmain(String[]args){//方式......
  • java程序员之路【转自尚学堂马士兵老师】
    每个人的学习方法是不同的,一个人的方法不见得适合另一个人,我只能是谈自己的学习方法。因为我学习Java是完全自学的,从来没有问过别人,所以学习的过程基本上完全是自己摸索出来的。我也不知道这种方法是否是比较好的方法,只能给大家提供一点参考了。学习Java的第一步是安装好JDK,写一......
  • JavaScript实现缩略图到全宽图像页的平滑过渡
    要实现缩略图到全宽图像页的平滑过渡效果,您可以使用JavaScript和CSS过渡效果来实现。下面是一个简单的示例:HTML:<divclass="thumbnail"onclick="expandImage(this)"><imgsrc="thumbnail_image.jpg"alt="ThumbnailImage"></div><divid="......
  • 如何从 javascript 中的 Web api 将 json 对象传递到项目的其余部分
    在将从WebAPI获取的JSON数据传递到项目的其他部分之前,您需要确保在完成fetch请求并获得响应后再进行处理。因为fetch是一个异步操作,需要等待服务器响应的完成才能获取到数据。在您的代码示例中,您可以将json数据传递给其他函数或组件进行后续处理。以下是一种可能的处理方式:fetch(B......