为什么Java中1000 == 1000为false,而100 == 100为true?

主要是Integer内部类IntegerCache缓存了从 - 128 到 127 之间的所有的整数对象

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
private static class IntegerCache {
static final int low = -128;
static final int high;
static final Integer cache[];

static {
// high value may be configured by property
int h = 127;
...
high = h;

cache = new Integer[(high - low) + 1];
int j = low;
for(int k = 0; k < cache.length; k++)
cache[k] = new Integer(j++);

assert IntegerCache.high >= 127;
}

private IntegerCache() {}
}

在声明Integer a = 100时,实际是调用了Integer.valueOf(int i),直接从缓存取值,从而不管声明几个变量都是对应的同一个对象。

1
2
3
4
5
public static Integer valueOf(int i) {
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}

参考:为什么Java中1000 == 1000为false,而100 == 100为true?