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


相关文章
|
人工智能 监控 NoSQL
JAVA
简要讲述Java的特性以及相关的Java调优工具
JAVA
|
Oracle Java 关系型数据库
Java是什么?
Java是什么?
180 0
|
Java 测试技术
1070 结绳(JAVA)
给定一段一段的绳子,你需要把它们串成一条绳。每次串连的时候,是把两段绳子对折,再如下图所示套接在一起。这样得到的绳子又被当成是另一段绳子,可以再次对折去跟另一段绳子串连。每次串连后,原来两段绳子的长度就会减半。
1070 结绳(JAVA)
|
小程序 Oracle Java
Java小史:从0到1
简单介绍下java的历史
199 0
Java小史:从0到1
|
Java
Java常见的坑(二)
你猜上述程序输出的是什么? 是 ABC easy as 123 吗? 你执行了输出操作,你才发现输出的是 ABC easy as [C@6e8cf4c6 ,这么一串丑陋的数字是什么鬼? 实际上我们知道字符串与任何数值的相加都会变为字符串,上述事例也不例外, numbers输出其实实际上是调用了Object.toString()方法,让numbers转变为'[c' + '@' + 无符号的十六进制数。
74 0
|
小程序 Java 编译器
关于Java
Java功能强大且简单
405 0
关于Java
|
安全 Java
java实用类
java实用类
112 0
|
Java
Java里面的arraycopy总结
Java里面的arraycopy总结
220 0
|
前端开发 Java 关系型数据库
JAVA知识
那么问题来了,JAVA为啥需要这么多类加载器(当然是多层负责每层对应的类系统,而且多态这个磨人的妖精很是厉害,需要多层加载机制进行处理。–个人理解)
20402 0