最近面试,被问到两个Integer直接用 == 比较有什么问题。自己回答的不是很好,先总结下:
@Test
public void integerTest() {
// case1
Integer a = new Integer(0);
Integer b = new Integer(0);
System.out.println(a == b); // false
// case2
Integer c = 0;
Integer d = 0;
System.out.println(c == d); // true
// case3
Integer e = 128;
Integer f = 128;
System.out.println(e == f); // false
//case4
int g = 128;
System.out.println(e == g); // true 自动拆箱
}
- 针对 case1, 很好理解,因为比较的是地址值,所以肯定不相等;
- 针对 case2 和 case3, Integer赋予一个int值的时候,它会调用一个valueOf()的方法。Integer a = Integer.valueOf(0);
Integer 的常量池是由-128至127组成。当我们给一个Integer 赋的值在这个范围之类时就直接会从缓存返回一个相同的引用,所以 case2 返回 true。而超过这个范围时,就会重新 new一个对象。所以 case3 返回 false。 - case4 ,包装类型和基本类型比较时,会自动拆箱,会转变为基本类型的比较。因此会转变为值的比较,所以返回 true;
参考:重新认识包装数据类型