zoukankan      html  css  js  c++  java
  • Integer IntegerCache源码

    先看一段测试结果:

    /*public static void main(String[] args) {
            Integer a = 128, b = 128;
            Integer c = 127, d = 127;
    
            System.out.println(a == b);//false
            System.out.println(c == d);//true
    
        }*/
        
        
        
        /*public static void main(String[] args) {
            Integer int1 = Integer.valueOf("100");
            Integer int2 = Integer.valueOf("100");
            System.out.println(int1 == int2);//true
        }*/
        
        
        public static void main(String[] args) {
            Integer int1 = Integer.valueOf("300");
            Integer int2 = Integer.valueOf("300");
            System.out.println(int1 == int2);//false
        }
        

    JDK的源码如下:

    复制代码
    public static Integer valueOf(String s) throws NumberFormatException {
            return Integer.valueOf(parseInt(s, 10));
        }
    
    public static Integer valueOf(int i) {
            if (i >= IntegerCache.low && i <= IntegerCache.high)
                return IntegerCache.cache[i + (-IntegerCache.low)];
            return new Integer(i);
        }
    复制代码

    发现里面另有玄机,多了个IntegerCache类:

    复制代码
    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把-128到127(可调)的整数都提前实例化了。

    这就解释了答案,原来你不管创建多少个这个范围内的Integer用ValueOf出来的都是同一个对象。

    但是为什么JDK要这么多此一举呢? 我们仔细想想, 淘宝的商品大多数都是100以内的价格, 一天后台服务器会new多少个这个的Integer, 用了IntegerCache,就减少了new的时间也就提升了效率。同时JDK还提供cache中high值得可配置,

    这无疑提高了灵活性,方便对JVM进行优化。

  • 相关阅读:
    多线程-上
    IO流之序列化
    IO流之标准输入输出流
    IO流之BufferedReader/BufferedWriter
    IO流之转换流
    IO流之字符输入输出流
    IO流之字节输入输出流
    JS Flex布局
    MSSQL case when
    钉钉审批流API
  • 原文地址:https://www.cnblogs.com/mr-wuxiansheng/p/7498678.html
Copyright © 2011-2022 走看看