Java关于对象的相等判断问题(equals)

之前对于对象的相等判断都比较含糊,最近看见了点规范的判断,稍微记一下。

java中的基本类型,包含:int、long、short、byte、char、boolean、float、double这8种,可以使用==号判断值是否相等。如果出现了基本类型的包装类,比如:Integer,用一个基本类型和一个包装类,使用==号也能正确判断,返回true。

Integer和int比较时,会自动拆箱,这是比较值是否相等。

所以建议在代码中能使用int就不要用Integer,因为这个拆箱过程会损耗性能,量少倒无所谓,但是量大就对性能影响比较大了。

而对于包装类或者自定义的类之间的比较,就不能使用==号了,这种情况我们一般使用类中的equals方法去判断。

String a = "abc";
String b = "abc";

System.out.println(a.equals(b));
 //结果:true

每个不同数据类型的equals实现也不同,所以这些在使用的过程中也会有小坑,具体可以看一下equals方法的实现,对于自己遇到的问题具体判断一下。

不管是使用==号判断、还是使用上边代码这种方式判断都是存在安全隐患的,例如当a为null时,是不存在equals方法的,会抛空指针异常。关于使用==号的异常情况在下文。对于一个已经上线的系统来说,这种莫名其妙的异常是不被允许的。

int c = 1;
Integer d = null;
System.out.println(c == d); 
//结果:NullPointerException 

int和Integer使用==号判断是否相等时,Integer会自动拆箱成int。

但由于d在自动拆箱的过程中,需要给它赋值int的默认值0。而给空对象,赋值0,必然会报空指针异常。

Objects.equals的作用

Objects类位于java.util包下,它是里面提供了很多对象操作的辅助方法。

重点关注一下equals方法的实现:

public static boolean equals(Object a, Object b) {
    return (a == b) || (a != null && a.equals(b));
}

equals方法的判断逻辑如下:

先判断对象a和b的引用是否相等,如果相等则直接返回true。

如果引用不相等,则判断a是否为null,如果a为null则返回false。

如果a不为null,调用对象的equals方法进一步判断值是否相等。

这种情况避免了空指针异常,至少不会抛错。

int a = 1;
int b = 1;
Integer c = null;
System.out.println(Objects.equals(a, c)); 
//结果:false
System.out.println(Objects.equals(c, a)); 
//结果:false
System.out.println(Objects.equals(a, b)); 
//结果:true

但是这种情况同样存在坑:

Integer a = 1;
long b = 1L;
System.out.println(a == b);
//结果:true
System.out.println(Objects.equals(a, b));
//结果:false

我们刚才看了Objects.equals会调用a类型的equals方法,那我们再来看看Integer类型的equals实现:

public boolean equals(Object obj) {
    if (obj instanceof Integer) {
        return value == ((Integer)obj).intValue();
    }
    return false;
}

可以看到这个equals先检查了入参是否是Integer类型,如果不是直接返回了false。b是Long类型,所以返回了false。

所以我们在使用Object.equals比较大小的时候,尽量保证两个入参类型相等。这样就能既能保证大小判断正常的情况下避免空指针异常。

文章参考:

https://blog.csdn.net/lisu061714112/article/details/123647907?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522167904887616800182121051%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=167904887616800182121051&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduend~default-2-123647907-null-null.142^v74^insert_down4,201^v4^add_ask,239^v2^insert_chatgpt&utm_term=object.equals&spm=1018.2226.3001.4187

有一说一人家写的比我好多了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值