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()实例。