解析Java中的128陷阱

所谓128陷阱,指的是两个Integer对象在 ( − 128 , 127 ) (-128, 127) (128,127) 范围内取相同值并且用==进行判定时,返回为true;如果在该范围之外取相同值判定则返回false

“==”和equals

  • “==”是运算符,如果比较的数据是基本数据类型,则比较存储的值;如果是引用数据类型,则比较所指向对象的地址
  • equals是父类Object的方法,比较的是所指向的对象的地址,一般情况下,重写之后比较的是对象的值。

int和Integer

128陷阱

  1. 两个Integer对象在 ( − 128 , 127 ) (-128, 127) (128,127) 范围内取值用==进行比较,如果值相同则返回true
    这是因为引用类型用==判定,就是在判定两个对象地址是否相同。Java 对于值在 ( − 128 , 127 ) (-128, 127) (128,127) 范围内的 Integer 对象会自动缓存,这表示如果你使用自动装箱创建了一个Integer对象,并且该值在 -128 到 127 之间,Java 会使用相同的实例对象。
Integer x1 = 127;
Integer x2 = 127;
System.out.println(x1 == x2); //true
  1. 两个Integer对象直接用==在 ( − 128 , 127 ) (-128, 127) (128,127) 范围外判定,无论值是否相同返回都为false
    如果传入数值不在范围内,Integer 对象不会被缓存,每次都会创建新的对象。那么每次被创建的对象都指向一个新的且不同的地址,即通过new关键字由JVM分配的新地址。因此,即使两个 Integer 对象的值相同,它们也不会是同一个实例。
Integer x1 = 128;
Integer x2 = 128;
System.out.println(x1 == x2); //false
  1. 一个int类型和一个Integer对象用==判定,若值相同返回true。
    这是因为Integerint的封装类,当intInteger进行==比较的时候,Integer会自动拆装为int类型,所以返回true
int x1 = 128;
Integer x2 = 128;
System.out.println(x1 == x2); //true
  1. equals() 方法在Integer类中被重写用于比较两个对象的值是否相等。因此,即使两个Integer对象不是同一个实例,只要它们的值相等,equals() 方法就会返回true
Integer x1 = 128;
Integer x2 = 128;
System.out.println(x1.equals(x2)); //true

如何避免128陷阱

所有整型包装类对象之间值的比较,全部使用 equals 方法比较。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值