new Integer(123) 与 Integer.valueOf(123) 的区别在于:
- new Integer(123) 每次都会新建一个对象;
- Integer.valueOf(123) 会应用缓存池中的对象,屡次调用会获得同一个对象的援用。
Integer a = 123;
Integer b = new Integer(123);
Integer c = Integer.valueOf(123);
System.out.println(a==b);
System.out.println(a==c);
编译器会在主动装箱过程调用 valueOf() 办法,因而多个值雷同且值在缓存池范畴内的 Integer 实例应用主动装箱来创立,那么就会援用雷同的对象。
valueOf() 办法的实现比较简单,就是先判断值是否在缓存池中,如果在的话就间接返回缓存池的内容。
public static Integer valueOf(int i) {if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}
根本类型对应的缓冲池如下:
- boolean values true and false
- all byte values
- short values between -128 and 127
- int values between -128 and 127
- char in the range u0000 to u007F
在应用这些根本类型对应的包装类型时,如果该数值范畴在缓冲池范畴内,就能够间接应用缓冲池中的对象。
在 jdk 1.8 所有的数值类缓冲池中,Integer 的缓冲池 IntegerCache 很非凡,这个缓冲池的下界是 – 128,上界默认是 127,然而这个上界是可调的,在启动 jvm 的时候,通过 -XX:AutoBoxCacheMax=<size> 来指定这个缓冲池的大小,该选项在 JVM 初始化的时候会设定一个名为 java.lang.IntegerCache.high 零碎属性,而后 IntegerCache 初始化的时候就会读取该零碎属性来决定上界。