Integer变量比较的问题

前两天去面试,碰到的难题,始终不明白,谢谢你的回答:

 

public static void main(String arg[]){
        
        Integer a=11;
        Integer b=11;
        System.out.println(a==b);
        System.out.println(a.equals(b));
        a=3311;
        b=3311;
        System.out.println(a==b);
        System.out.println(a.equals(b));
        
    }

 

答案是true,true,false,true

 

想问的是: 为什么变量 a 在重新赋值3311后,a==b比较的结果是false呢?  !谢谢

楼主的代码实际上被Java编译器解析成了
[code="java"] Integer a = Integer.valueOf(11);
Integer b = Integer.valueOf(11);
System.out.println(a == b);
System.out.println(a.equals(b));
a = Integer.valueOf(3311);
b = Integer.valueOf(3311);
System.out.println(a == b);
System.out.println(a.equals(b));[/code]

通过观察valueOf函数就可以发现

[code="java"] public static Integer valueOf(int i) {
final int offset = 128;
if (i >= -128 && i <= 127) { // must cache
return IntegerCache.cache[i + offset];
}
return new Integer(i);
}[/code]

-128 ~ 127 这个范围内的数被Java缓存的 类似一个线程池或连接池之类的结构
如果valueOf的数在这个范围之内的话,取到的就是同一个对象.

否则就是new Integer(i) 两个3311的赋值语句 就是创建了两个Integer对象.
自然用 == 来比较的话 结果就是false了.
( == 比较是否是同一对象, equals 比较值相等)

楼上说的没错,-128 ~ 127 这个范围内的数被Java缓存的,会遇到这种问题
所以一般比较整型数据,最好是转换成int,再比较,这样安全些