最近面试,被问到两个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;
参考: