Java Integer常量池

public class IntegerExample {  
   public static void main(String[] javalatte) {  
      Integer i = 10;  
      Integer j = new Integer(10);  
      Integer k = 130;  
      Integer p = new Integer(130);  
   }  
}  

将上面的类编译后再反编译得到如下的类:

public class IntegerExample {  
   public static void main(String[] javalatte) {  
      Integer i = Integer.valueOf(10);  
      Integer j = new Integer(10);  
      Integer k = Integer.valueOf(130);  
      Integer p = new Integer(130);  
   }  
}  

即当我们用Integer i = 10 创建Integer类的实例时,其实是调用了Integer.valueOf()方法;

从JDK源码中我们可以看到:

public static Integer valueOf(int i) {
    assert IntegerCache.high >= 127;
    if (i >= IntegerCache.low && i <= IntegerCache.high)
        return IntegerCache.cache[i + (-IntegerCache.low)];
    return new Integer(i);
}

当我们在[-128,127]里调用valueOf()时,实际上使用的是IntegerCache(缓存)里的值,如果用超出此范围的值给封装类赋值时,Integer.valueOf()会返回new Integer()实例。

posted @ 2017-02-16 10:26  如果屈原会编程  阅读(1470)  评论(0编辑  收藏  举报