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


相关文章
|
2月前
|
存储 IDE Java
Java“ClassFormatError”解决
Java中的“ClassFormatError”是一个运行时异常,通常发生在类文件格式不正确或被篡改时。本文将介绍该错误的常见原因及解决方法,帮助开发者快速定位并解决问题。
67 2
|
存储 SQL 缓存
JAVA问答16
JAVA问答16
127 0
AbstractDemo.java
AbstractDemo.java
74 0
|
Cloud Native Oracle Java
一篇文章和你从 Java1 聊到 Java18
002-2022 年的 20 年里 Java 始终保持在前三的水平,其中在 2005 年、2013-2015 年间、2021 年等时间还多次登顶过第一,这么一个已经发布了 27 年的语言在这些年是怎么始终保持在编程语言前三的呢?这么多年 Java 各个版本间又有什么变化?Java 语言在未来还会继续保持成为语言的常青树吗?这篇文章就来和大家回顾一下 Java 的历史。
300 0
一篇文章和你从 Java1 聊到 Java18
|
Java
Java常见的坑(二)
你猜上述程序输出的是什么? 是 ABC easy as 123 吗? 你执行了输出操作,你才发现输出的是 ABC easy as [C@6e8cf4c6 ,这么一串丑陋的数字是什么鬼? 实际上我们知道字符串与任何数值的相加都会变为字符串,上述事例也不例外, numbers输出其实实际上是调用了Object.toString()方法,让numbers转变为'[c' + '@' + 无符号的十六进制数。
74 0
|
存储 Java
Java - 9 个小技巧让你的 if else 看起来更优雅(一)
Java - 9 个小技巧让你的 if else 看起来更优雅(一)
399 0
Java - 9 个小技巧让你的 if else 看起来更优雅(一)
|
分布式计算 Java 关系型数据库
蓦然回首,Java 已经 24 岁了!
蓦然回首,Java 已经 24 岁了!
蓦然回首,Java 已经 24 岁了!
java
java程序如何正确打日志
267 0
|
算法 Java Linux
Java ConcurrentSkipListMap 实现
本文目前只是简单地介绍了 Java 并发容器中 ConcurrentSkipListMap 的实现方式,后续会考虑拓展本文,从源码的角度进行详细的分析。
Java ConcurrentSkipListMap 实现