当我们在Java中打入一段代码
Integer a = 100, b = 100;
Integer c = 1000, d = 1000;
System.out.println(a==b);
System.out.println(c==d);
根据我们对Java的认识,如果两个引用指向同一个对象,那么==判断的值是相等的,否则的话,即使两个引用指向的对象的内容相同,==判断的结果还是false。所以,我们可以初步判断最后这段代码显示的结果应该是两个false。然而,结果却是,第一个true,第二个false。为什么呢?实际上,这里的c==d是false没有问题的,问题就在为什么a==b是true呢?按照想法一步一步来,先用XJad(Java的反编译工具)把.class文件反汇编来看看,我们可以看到,字节码文件反汇编出来的结果是一下所示,
Integer integer = Integer.valueOf(100);
Integer integer1 = Integer.valueOf(100);
Integer integer2 = Integer.valueOf(1000);
Integer integer3 = Integer.valueOf(1000);
System.out.println(integer == integer1);
System.out.println(integer2 == integer3);
两者之间并没有太大的区别,都是使用了Integer.valueOf方法,那问题肯定就出在了valueOf方法上,我们再去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);
}
好,很明显从这段代码中可以看出valueOf做了个小小的处理,涉及到了一个类,叫IntegerCache的类,从这个类上我们其实大致上已经可以猜出为什么a==b是true了,肯定是Integer类中对某一些数字做了缓存。再把IntegerCache类打开来看,发现实际上这个IntegerCache类是Integer的一个内部类,它将-128到+127的数字缓存到了Cache中,也就是高速缓存中,所以当值的范围在-128到+127,Integer的valueOf方法无需再new出一个新的Integer对象,而是直接从高速缓存中返回实例,又因为是同一个实例,所以这里的a==b的结果是true。
为什么Java要做这样的处理,我个人想了下有可能是Java的发明者认为小的数用的比较多,所以把他们放到缓存中可以提高程序运行效率。