楼主的代码实际上被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 比较值相等)