首页 > 其他分享 >整数缓存池

整数缓存池

时间:2022-10-26 21:57:31浏览次数:77  
标签:缓存 int 整数 high low 127 128 Integer

int num1=100;//基本类型的定义
Integer num2=100;
Integer num3=Integer.valueOf(100);
//同一个对象,都在数组里面
Integer num4=new Integer(100);
Integer num5=new Integer(100);
System.out.println(num2==num3);//true
System.out.println(num3==num4);//false
System.out.println(num4==num5);//false

上面结果应该很容易想到,但是如果我再定义两个对象,并且值是128,那会咋样呢?

Integer num6=128;
Integer num7=128;
System.out.println(num7==num6);

输出是false,为什么呢?这时候我们可以看一下,valueOf的底层代码:

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

可以看到它是调用了IntegerCache静态类的两个属性low和high来返回不同的结果,如果i在low和high之间返回数值,超出就返回一个新的对象,那我们可以点开看看这个类的取值范围:

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 =
            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;
    }

可以看到,比较的范围是-128~127。当超出这个范围的时候,就会给创建一个新的对象,所以才会出现num7!=num6的结果。

对于Short,Long,Byte也都是用的整数缓存池,范围都是-128~127,字符型包装类Character则是0到127

标签:缓存,int,整数,high,low,127,128,Integer
From: https://www.cnblogs.com/Liku-java/p/16830207.html

相关文章

  • 字符串转换整数 (atoi)
    请你来实现一个 myAtoi(strings) 函数,使其能将字符串转换成一个32位有符号整数(类似C/C++中的atoi函数)。函数 myAtoi(strings)的算法如下:读入字符串并丢弃无......
  • 聊一聊作为高并发系统基石之一的缓存,会用很简单,用好才是技术活
    大家好,又见面了。本文是笔者作为掘金技术社区签约作者的身份输出的缓存专栏系列内容,将会通过系列专题,讲清楚缓存的方方面面。如果感兴趣,欢迎关注以获取后续更新。在......
  • MySQL基础篇--全局缓存和线程缓存
    MySQL全局缓存key_buffer_size决定索引处理的速度,尤其是索引读的速度。默认值是16M,通过检查状态值Key_read_requests和Key_reads,可以知道key_buffer_size设置是否合理。比例......
  • log4net 文件日志缓存(buffersize)
    公司用log4net记录日志,文件的形式,后面想记录的东西越来越多。发现会出现文件被占用的情况。就想log4net应该有缓存,当要写入的文件达到一定数量的时候再写入。然后在网上查......
  • 【Java[方法调用]】7-2 整数排序(降序)
    输入5个整数,对所有整数进行排序,按照降序输出。输入格式:输入5个整数。输出格式:按照降序输出5个整数。输入样例1:13526输出样例1:65321输入样例2:182......
  • 1655. 分配重复整数
    题目描述给了一个数组nums,数组中最多有50个不同的值再给了m个顾客的订单数组,数组元素ei的含义是第i个顾客需要有ei个相同的整数问给的nums能不能满足以上所有顾客的要求......
  • Git配置、缓存用户名密码和清除缓存
    配置用户名和邮箱:gitconfig--globaluser.name"username"gitconfig--globaluser.email"[email protected]"清除配置中纪录的用户名和密码,下次提交代码时会让重......
  • linux 清理java缓存,Linux手动释放缓存的方法
    Linux释放内存的命令:syncecho1>/proc/sys/vm/drop_cachesdrop_caches的值能够是0-3之间的数字,表明不一样的含义:0:不释放(系统默认值)1:释放页缓存2:释放dentries和in......
  • (算法课)大整数相乘 |向量卷积|多项式相乘| 快速傅里叶变换FFT
    D(1021):很大的ABTimeLimit:1SecMemoryLimit:256MbSubmitted:6Solved:0Description如题,计算AB的值并输出。Input两行,分别代表A和B。A和B......
  • 剑指Offer-14-剪绳子/力扣-343-整数拆分
    对于一段绳子,第一刀下去可以将绳子分成i和n-i两段,其中i的取值范围为[1,n-1]dp[n]表示n可分成的最大乘积和,dp[n]=max(dp[n],max(i*n-i,i*f(n-i)))初始化:全部初始化为1i......