问题引入
1  | public class Main {  | 
问题分析
通过查看valueOf()方法的源码查看方法的实现:1
2
3
4
5public static Integer valueOf(int i) {
        if (i >= IntegerCache.low && i <= IntegerCache.high)
            return IntegerCache.cache[i + (-IntegerCache.low)];
        return new Integer(i);
    }
Integer的作者在写这个类时,为了避免重复创建对象,对Integer值做了缓存,如果输入的整型参数在[IntegerCache.low, IntegerCache.high]内,那么直接返回缓存好的对象,反之new一个新的对象Integer()。
那么缓存的内容是什么呢?看一下IntegerCache这个类:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33private 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() {}
    }
以上代码中首先检查虚拟机里有没有相应的配置,如果有,取该值,反之取默认的127。然后创建缓存数组,并给数组初始化值。这是一个内部静态类,该类只能在Integer这个类的内部访问,这个类在初始化的时候,回去加载JVM的配置,如果有值,就用配置的值初始化缓存数组,否则就缓存-128到127之间的值。
问题解决
把valueOf()方法替换成parseInt()方法即可,parseInt()返回的是基本类型int。