包装器==比较不相等问题(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));
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值