包装器==比较不相等问题(128陷阱),自动装箱,自动拆箱

如下代码:

Integer a = 128;
Integer b = 128;
System.out.print(a==b);

上述代码最后输出的结果时false
这是为什么呢?
因为Integer是包装器类型,当我们运用包装器类型时,会有自动装箱,或自动拆箱的变换,如下:

自动装箱
基本类型int需要赋值给值类型为Integer包装器类型是,有自动装箱变换

ArrayList<Integer> list = new ArrayList();
list.add(3);
//实际上会自动装箱变换为
list.add(Integer.valueOf(3))

自动拆箱
Integer对象赋值给int时,会自动拆箱

ArrayList<Integer> list = new ArrayList();
int n = list.get(i);
//实际上会自动拆箱变换为
int n = list.get(i).intValue();

而最上面的比较代码中,==运算符也适用于包装器类型,==运算符是比较两个变量指向的是不是同一个存储区域。而自动装箱规范要求,boolean、byte、char<=127,而 -128<= short、int <=127被包装到固定的对象中。所以如果设置a,b等于127,介于-128~127之间,他俩就会指向的同一个对象,所以用==比较的话,结果就会是true。
解决这个问题的办法是在两个包装器对象的比较时调用equals方法。
如下即可返回true

Integer a = 128;
Integer b = 128;
System.out.print(a.equals(b));

你可能感兴趣的:(java基础,java)