我是靠谱客的博主 激动小鸭子,最近开发中收集的这篇文章主要介绍Integer的缓存问题——java学习总结(9),觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

一、先考虑一下这个demo的输出是什么

public class Main {
  public static void main(String[] args) {
   
    Integer i1 = 100;
    Integer i2 = 100;
    Integer i3 = 200;
    Integer i4 = 200;
   
    System.out.println(i1==i2);
    System.out.println(i3==i4);
 }
}

运行结果:

true
false

二、为什么会出现这样的结果?

输出结果表明i1和i2指向的是同一个对象,而i3和i4指向的是不同的对象。
此时只需一看源码便知究竟,下面这段代码是Integer的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到IntegerCache.high之间的整数,则会使用IntegerCache的cache缓存对象,否则就new一个Integer。

三、再看看IntegerCache的源码

/**
 * Cache to support the object identity semantics of autoboxing for values between
 * -128 and 127 (inclusive) as required by JLS.
 *
 * The cache is initialized on first usage.  The size of the cache
 * may be controlled by the {@code -XX:AutoBoxCacheMax=<size>} option.
 * During VM initialization, java.lang.Integer.IntegerCache.high property
 * may be set and saved in the private system properties in the
 * jdk.internal.misc.VM class.
 */

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 =
            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;
        //此处在初始使用的时候就创建缓存放进Integer对象
        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() {}
}

38行处创建缓存数组,以后使用valueOf时会先判断是否使用缓存

最后

以上就是激动小鸭子为你收集整理的Integer的缓存问题——java学习总结(9)的全部内容,希望文章能够帮你解决Integer的缓存问题——java学习总结(9)所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(56)

评论列表共有 0 条评论

立即
投稿
返回
顶部