IntegerCache类的作用

参考答案

1.  IntegerCache介绍

IntegerCache是JDK在版本1.5中添加的一项新特性,为Integer类的缓存类,默认缓存了-128~127的Integer值,如遇到[-128,127]范围的值需要转换为Integer时会直接从IntegerCache中获取,用于提升性能和节省内存。

所以,这个范围内的自动装箱(相当于调用valueOf(int i)方法)的数字,都会从缓存中获取,返回同一个数字。

用两个实例来帮助理解,加深印象。

2.  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() {}
  }

在代码中看到,low为-128,high为127。

在Java编程中,如要使用-128——127这个区间的对象,是直接使用这个Cache中的对象的。

举个例子,代码如下:

package p201108.practicalBook.chapter02;

public class AutoBoxingTrouble1 {

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Integer x = 10;
        Integer y = 10;
        
        if(x == y) {
            System.out.println(" x == y");
        } else {
            System.out.println(" x != y");
        }
    }

}

结果:

x == y

 

实例二

不在缓冲区内

package p201108.practicalBook.chapter02;

public class AutoBoxingtrouble2 {

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Integer x = 500;
        Integer y = 500;
        
        if(x == y) {
            System.out.println(" x == y");
        } else {
            System.out.println(" x != y");
        }
    }

}

结果:

x != y

在自动装箱AutoBoxing方面,可见Java却是做了一些工作来提高效率。

如果需要确切的、可控制的对象,还是要使用new关键字来初始化对象。

例如:

package p201108;

public class Test01 {

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Integer value1 = new Integer(10);
        Integer value2 = new Integer(10);
        
        if(value1 == value2) {
            System.out.println(" value1 == value2");
        } else {
            System.out.println(" value1 != value2");
        }
    }

}

结果:

value1 != value2

以上,是Java面试题【IntegerCache类的作用】的参考答案。

 

输出,是最好的学习方法。

欢迎在评论区留下你的问题、笔记或知识点补充~

—end—

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧