Java: JDK居然有个叫整型池的东西

其实下面这些个assert语句都可以通过junit测试。

1
2
3
4
5
6
7
8
@Test
public void integerValueOfTest() {
Assert.assertTrue(Integer.valueOf(-128) == Integer.valueOf(-128));
Assert.assertFalse(Integer.valueOf(128) == Integer.valueOf(128));
Assert.assertTrue(Integer.valueOf(127) == Integer.valueOf(127));
Assert.assertTrue(Integer.valueOf(1) == Integer.valueOf(1));
Assert.assertFalse(Integer.valueOf(1000) == Integer.valueOf(1000));
}

"Integer.valueOf()"

Integerpublic static Integer valueOf(int i)是一个工厂方法,每次调用都会返回一个新的Integer的对象。

但是为什么对于127128的两个结果完全不一样???

撸一眼JDK的源码看看,底下就是那个valueOf的具体实现:

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);
}

原来内部有个整型池(默认IntegerCache.low = -128IntegerCache.high = 127),这样valueOf对于-128 ~ 127之间的返回值都是从池里面获取的。

可怜的不在这个范围内的整数!默哀