- new Integer() 每次都会新建一个对象
- Integer.valueOf() 会使用缓存池中的对象,多次调用会取得同一个对象的引用
Integer x = new Integer(1);
Integer y = new Integer(1);
System.out.println(x == y);
Integer z = Integer.valueOf(1);
Integer k = Integer.valueOf(1);
System.out.println(z == k);
valueof的实现很简单,判断是否在缓存池中,在则返回引用,否则创建
public static Integer valueOf(int i) {
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}
在 Java 8 中,不同类型缓存池的大小默认不同。
基本类型对应的缓冲池如下:
- 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