Java之IntegerCache

简介: Java之IntegerCache

这是太常见的一道面试题了,而且多用来做笔试题,毕竟有些基础,而且还是个选择题。


IntegerCache,从名称上来看,就是整型数据的缓存,其实从功能上来说,也非常像是缓存概念。


先来看一下常会在笔试题中出现的一道相关题目吧。


public class IntegerTest { 
    public static void main(String [] args) { 
        Integer a = 100, b = 100 ,c = 129,d = 129; 
        System.out.println(a==b); 
        System.out.println(c==d); 
    } 
}

通常还会有几个选项,但是我们在这就不说了,只说一下到底输出了一个什么样的值。


先来正确答案:


true
false

为什么会有这种情况的发生呢?当然就是IntegerCache的作用了,刚才也说了,他提供了缓存功能,但是到底缓存了哪些信息呢?


IntegerCache默认缓存了-128~127的Integer值,只要是在这个范围内的数据,都会直接从IntegerCache中进行获取,无须新创建一个对象。


这个也可以在Integer源码中轻松看出来。

image.png

具体代码如下:


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;
    }
    private IntegerCache() {}
}


就是一个在Integer类中的一个内部类,用于定义常用数值的缓存区,这个缓存区的数字大小范围而且还是可以指定的。


从代码中也可以看出,代码中获取了一个integerCacheHighPropValue值,在这之后,这个值又通过转换后,与127进行选择一个最大值。


也就是说,如果我设置了java.lang.Integer.IntegerCache.high这个参数,也就可以扩大这个缓存区的空间了。


sun.misc.VM.getSavedProperty("java.lang.Integer.IntegerCache.high")


那这中取值是如何配置呢,答案是-Djava.lang.Integer.IntegerCache.high


相关文章
|
前端开发 Java 数据安全/隐私保护
学JAVA,从现在开始-day05
每日记录自己学习java的心得和体会~
|
缓存 负载均衡 Java
JAVA问答5
JAVA问答5
111 0
|
存储 负载均衡 监控
JAVA问答4
JAVA问答4
135 0
1086 就不告诉你(JAVA)
做作业的时候,邻座的小盆友问你:“五乘以七等于多少?”你应该不失礼貌地围笑着告诉他:“五十三。”本题就要求你,对任何一对给定的正整数,倒着输出它们的乘积。
1086 就不告诉你(JAVA)
|
存储 Android开发
java35-巩固练习
java35-巩固练习
113 0
java35-巩固练习
|
人工智能 Java
Java i++ 与 ++i
Java i++ 与 ++i
152 0
Java i++ 与 ++i
|
Java
Java常见的坑(二)
你猜上述程序输出的是什么? 是 ABC easy as 123 吗? 你执行了输出操作,你才发现输出的是 ABC easy as [C@6e8cf4c6 ,这么一串丑陋的数字是什么鬼? 实际上我们知道字符串与任何数值的相加都会变为字符串,上述事例也不例外, numbers输出其实实际上是调用了Object.toString()方法,让numbers转变为'[c' + '@' + 无符号的十六进制数。
71 0
|
Java
java if..else
java if..else
133 0
java if..else
下一篇
无影云桌面