Java的8种基本类型(Byte, Short, Integer, Long, Character, Boolean, Float, Double), 除Float和Double以外, 其它六种都实现了常量池, 但是它们只在大于等于-128并且小于等于127时才使用常量池。
由如下例子可以看出:
- public static void main(String[] args) {
- Integer a = 127;
- Integer b = 127;
- System.out.println("等于127:");
- System.out.println(a == b);
- System.out.println("*****************");
- a = 128;
- b = 128;
- System.out.println("等于128:");
- System.out.println(a == b);
- System.out.println("*****************");
- a = -128;
- b = -128;
- System.out.println("等于-128:");
- System.out.println(a == b);
- System.out.println("*****************");
- a = -129;
- b = -129;
- System.out.println("等于-129:");
- System.out.println(a == b);
- System.out.println("*****************");
- // 测试Boolean
- System.out.println("测试Boolean");
- Boolean c = true;
- Boolean d = true;
- System.out.println(c == d);
- d = new Boolean(true);
- System.out.println(c == d);
- }
结果如下:
等于127:
true
*****************
等于128:
false
*****************
等于-128:
true
*****************
等于-129:
false
*****************
测试Boolean
true
false
当我们给Integer赋值时,实际上调用了Integer.valueOf(int)方法(编译期进行装箱),查看源码,其实现如下:
- public static Integer valueOf(int i) {
- if(i >= -128 && i <= IntegerCache.high)
- return IntegerCache.cache[i + 128];
- else
- return new Integer(i);
- }
而IntegerCache实现如下:
- 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() {}
- }
注意cache数组是静态的。
下面的语句不会缓存常量:
Integer integer = new Integer(127);
因为使用了new关键字,一定是创建了一个新的对象,无法进行缓存优化。