• java基础---Integer缓存机制---Integer缓存机制


    当使用自动装箱的时候,也就是将基本数据类型传递给对象类的时候触发自动装箱。这个时候java虚拟机会创建一系列的整数并且缓存到一个数组中以便直接使用,这就是缓存策略。

     
    ===自动装箱机制
    Java 编译器把原始类型自动转换为封装类的过程称为自动装箱(autoboxing),这相当于调用 valueOf 方法
    Integer a = 10; //this is autoboxing
    Integer b = Integer.valueOf(10); //under the hood
     
     
    === Integer 缓存策略
    这种 Integer 缓存策略仅在自动装箱(autoboxing)的时候有用,使用构造器创建的 Integer 对象不能被缓存。
    上面的规则适用于整数区间 -128 到 +127。
    因为Integer.valueof就是缓存策略执行的地方
     
    ===Integer.valueof(int i)
       public static Integer valueOf(int i) {
           if (i >= IntegerCache.low && i <= IntegerCache.high)
               return IntegerCache.cache[i + (-IntegerCache.low)];
           return new Integer(i);
       }
     
    ===IntegerCache
    Javadoc 详细的说明这个类是用来实现缓存支持,并支持 -128 到 127 之间的自动装箱过程。最大值 127 可以通过 JVM 的启动参数 -XX:AutoBoxCacheMax=size 修改。 缓存通过一个 for 循环实现。从小到大的创建尽可能多的整数并存储在一个名为 cache 的整数数组中。这个缓存会在 Integer 类第一次被使用的时候被初始化出来。以后,就可以使用缓存中包含的实例对象,而不是创建一个新的实例(在自动装箱的情况下)。
     
        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;
            }
     
            p
     
     
    ===其他缓冲行为
    其他缓存的对象
    这种缓存行为不仅适用于Integer对象。我们针对所有整数类型的类都有类似的缓存机制。
    有 ByteCache 用于缓存 Byte 对象
    有 ShortCache 用于缓存 Short 对象
    有 LongCache 用于缓存 Long 对象
    有 CharacterCache 用于缓存 Character 对象
    Byte,Short,Long 有固定范围: -128 到 127。对于 Character, 范围是 0 到 127。除了 Integer 可以通过参数改变范围外,其它的都不行。
     
  • 相关阅读:
    543. Diameter of Binary Tree【Easy】【二叉树的直径】
    114. Flatten Binary Tree to Linked List【Medium】【将给定的二叉树转化为“只有右孩子节点”的链表(树)】
    Java实现蛇形矩阵
    215. Kth Largest Element in an Array【Medium】【找到第 k 大的元素】
    524. Longest Word in Dictionary through Deleting【Medium】【删除后得到的字典中的最长单词】
    141. Linked List Cycle【Easy】【判断链表是否存在环】
    88. Merge Sorted Array【Easy】【双指针-不用额外空间归并两个有序数组】
    680. Valid Palindrome II【Easy】【双指针-可以删除一个字符,判断是否能构成回文字符串】
    345. Reverse Vowels of a String【Easy】【双指针-反转字符串中的元音字符】
    633. Sum of Square Numbers【Easy】【双指针-是否存在两个数的平方和等于给定目标值】
  • 原文地址:https://www.cnblogs.com/buptyuhanwen/p/9396960.html
Copyright © 2020-2023  润新知