• Java Integer类的缓存


    首先看一段代码(使用JDK 5),如下:
    public class Hello   
    {   
      public static void main(String[] args)   
      {   
        int a = 1000, b = 1000;   
        System.out.println(a == b);   
      
        Integer c = 1000, d = 1000;   
        System.out.println(c == d);   
      
        Integer e = 100, f = 100;   
        System.out.println(e == f);   
      }   
    }

    输出结果:

    true  
    false  
    true

    The Java Language Specification, 3rd Edition 写道:

    为了节省内存,对于下列包装对象的两个实例,当它们的基本值相同时,他们总是==:  
     Boolean  
     Byte  
     Character, u0000 - u007f(7f是十进制的127)  
     Integer, -128 — 127


    查看jdk源码,如下:

       /** 
         * 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. During VM initialization the 
         * getAndRemoveCacheProperties method may be used to get and remove any system 
         * properites that configure the cache size. At this time, the size of the 
         * cache may be controlled by the vm option -XX:AutoBoxCacheMax=<size>. 
         */  
      
        // value of java.lang.Integer.IntegerCache.high property (obtained during VM init)  
        private static String integerCacheHighPropValue;  
      
        static void getAndRemoveCacheProperties() {  
            if (!sun.misc.VM.isBooted()) {  
                Properties props = System.getProperties();  
                integerCacheHighPropValue =  
                    (String)props.remove("java.lang.Integer.IntegerCache.high");  
                if (integerCacheHighPropValue != null)  
                    System.setProperties(props);  // remove from system props  
            }  
        }  
      
        private static class IntegerCache {  
            static final int high;  
            static final Integer cache[];  
      
            static {  
                final int low = -128;  
      
                // high value may be configured by property  
                int h = 127;  
                if (integerCacheHighPropValue != null) {  
                    // Use Long.decode here to avoid invoking methods that  
                    // require Integer's autoboxing cache to be initialized  
                    int i = Long.decode(integerCacheHighPropValue).intValue();  
                    i = Math.max(i, 127);  
                    // Maximum array size is Integer.MAX_VALUE  
                    h = Math.min(i, Integer.MAX_VALUE - -low);  
                }  
                high = h;  
      
                cache = new Integer[(high - low) + 1];  
                int j = low;  
                for(int k = 0; k < cache.length; k++) //缓存区间数据  
                    cache[k] = new Integer(j++);  
            }  
      
            private IntegerCache() {}  
        }  
      
        /** 
         * Returns a <tt>Integer</tt> instance representing the specified 
         * <tt>int</tt> value. 
         * If a new <tt>Integer</tt> instance is not required, this method 
         * should generally be used in preference to the constructor 
         * {@link #Integer(int)}, as this method is likely to yield 
         * significantly better space and time performance by caching 
         * frequently requested values. 
         * 
         * @param  i an <code>int</code> value. 
         * @return a <tt>Integer</tt> instance representing <tt>i</tt>. 
         * @since  1.5 
         */  
        public static Integer valueOf(int i) {  
            if(i >= -128 && i <= IntegerCache.high)  
                return IntegerCache.cache[i + 128];  
            else  
                return new Integer(i);  
        }

    这儿的IntegerCache有一个静态的Integer数组,在类加载时就将-128 到 127 的Integer对象创建了,并保存在cache数组中,一旦程序调用valueOf 方法,如果i的值是在-128 到 127 之间就直接在cache缓存数组中去取Integer对象。

    再看其它的包装器:

    Boolean:(全部缓存)
    Byte:(全部缓存)
    Character(<= 127缓存)
    Short(-128 — 127缓存)
    Long(-128 — 127缓存)
    Float(没有缓存)
    Doulbe(没有缓存)


    同样,对于垃圾回收器来说:
    Integer i = 100;     
    i = null;//will not make any object available for GC at all.
    这里的代码不会有对象符合垃圾回收器的条件,这儿的i虽然被赋予null,但它之前指向的是cache中的Integer对象,而cache没有被赋null,所以Integer(100)这个对象还是存在。

    而如果i大于127或小于-128则它所指向的对象将符合垃圾回收的条件:

    Integer i = 10000;     
    i = null;//will make the newly created Integer object available for GC.

    转载地址: http://blog.csdn.net/xiaohai0504/article/details/6885137


  • 相关阅读:
    Oracle备份恢复之无备份情况下恢复undo表空间
    Oracle HA 之 测试RAC的功能
    (转)Python——functools
    (转)Python标准库:内置函数print(*objects, sep=' ', end=' ', file=sys.stdout, flush=False)
    (转)用Python写堡垒机项目
    (转)Python进阶:函数式编程(高阶函数,map,reduce,filter,sorted,返回函数,匿名函数,偏函数)
    (转)Linux中的位图
    (转)Python标准库02 时间与日期 (time, datetime包)
    (转)Python 3 collections.defaultdict() 与 dict的使用和区别
    (转)python高级:列表解析和生成表达式
  • 原文地址:https://www.cnblogs.com/hehe520/p/6330052.html
Copyright © 2020-2023  润新知