先看一个例子,

1
2
3
4
5
6
7
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);}

运行结果:

1
2
false
true

基本知识:我们知道,如果两个引用指向同一个对象,用==表示它们是相等的。如果两个引用指向不同的对象,用==表示它们是不相等的,即使它们的内容相同。

因此,后面一条语句也应该是false 。这就是它有趣的地方了。如果你看去看Integer.java 类,你会发现有一个内部私有类,IntegerCache.java,它缓存了从-128到127之间的所有的整数对象。所以事情就成了,所有的小整数在内部缓存,然后当我们声明类似——

1
Integer c = 100;

实际上是

1
Integer i = Integer.valueOf(100);

查看Integer.valueOf()函数的源码:

1
2
3
4
5
6
7
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之间,它就从高速缓存返回实例。

所以对于-128到127之间的数字,对于

1
 Integer c=100,d=100;

c和d其实本质上指向的都是同一个缓存中拿到的数据,所以==返回true。