前两天去面试,碰到的难题,始终不明白,谢谢你的回答:
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,再比较,这样安全些