int 是 java 内置的基本数据类型,对应有一个包装类型 Integer。
Integer 内部有一个缓存 IntegerCache,通过享元模式,将最常用的 Integer 缓存,节省内存。
private static class IntegerCache {
static final int low = -128;
static final int high;
static final Integer[] cache;
static Integer[] archivedCache;
static {
// high value may be configured by property
int h = 127;
// ...... ignore some code
int size = (high - low) + 1;
// Use the archived cache if it exists and is large enough
if (archivedCache == null || size > archivedCache.length) {
Integer[] c = new Integer[size];
int j = low;
for(int i = 0; i < c.length; i++) {
c[i] = new Integer(j++);
}
archivedCache = c;
}
cache = archivedCache;
// range [-128, 127] must be interned (JLS7 5.1.7)
assert IntegerCache.high >= 127;
}
private IntegerCache() {}
}
如上,IntegerCache 在初始化时生成了 -128 ~ 127 内的 Integer,需要使用时直接从享元取。
public static Integer valueOf(int i) {
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}
-128 ~ 127 的数只有通过 valueOf() 的才从享元组取,通过 new 创建的是一个新的对象。
例如
Integer a = 10;
Integer b = 10;
System.out.println(a == b); // true
b = new Integer(10);
System.out.println(a == b); // false
a = 128;
b = 128;
System.out.println(a == b); // false
结论:
- Integer 在 -127 ~~ 128 内的数,使用享元模式,缓存对象;
- 通过 new Integer 产生的是新对象;
- 其他数每次都是新对象。