这就要说到常量池了,JAVA的基本类型有六种(除了Double和Float之外)都实现了常量池, 不过它们只在大于等于-128并且小于等于127时才会使用常量池。
我们通过分析Integer的Integer.valueOf()方法便能清楚的看出来原因了。- public static Integer valueOf(int i) {
- if(i >= -128 && i <= IntegerCache.high)
- return IntegerCache.cache[i + 128];
- else
- return new Integer(i);
- }
- 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() {}
- }
复制代码 如果你想了解更底层的工作原理只能去分析JVM是如何操作内存空间的了吧。。 |