这可能是个讨论得较多的话题,但是我觉得它很有趣:为什么1000==1000返回false,100==100返回true?
public static void main(String[] args) {
Integer a = 1000, b = 1000;
System.out.println(a == b);
Integer c = 100, d = 100;
System.out.println(c == d);
}
这段代码运行之后打印出的结果一定会让你赶到困惑,请看:
false
true
我们知道,如果两个引用指向同一个对象,那么它们在==.如果两个引用指向不同的对象,那么即使它们具有相同的内容,它们在==方面也不相等。
这实际上是有趣的地方。如果查看Integer.java类,您会发现有一个内部私有类,IntegerCache.java,它缓存-128和127之间的所有Integer对象。
所以问题是,所有的小整数在内部缓存,当我们声明类似以下内容的时候
Integer a = 1000;
它在内部做什么
Integer i = Integer.valueOf(100);
我们来看看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);
}
如果整数的值介于-128和127之间,那么将返回缓存中的对象,所以
Integer a = 1000, b = 1000;
是同一个对象。
那么问题来了,为什么这里要使用缓存?