美文网首页
Java中的相等比较

Java中的相等比较

作者: 一碗米汤_bb44 | 来源:发表于2021-02-03 14:41 被阅读0次

    说一说java中的相等比较。

    在日本做开发,遇到很多转职Java的小白,常常搞不懂Java中的相等的比较怎么用,所以今天就重点来解释一下Java中相等比较正确使用姿势。

    先说一下结论

    1. 如果是基础数据类型的相等 使用 ==

    2. 如果是引用类型的比较90% 的情况下使用equals方法比较两个对象是不是相等,特殊情况使用 == 判断两个对象是不是相等

    为什么会这样呢,这就要说到java中的数据存储了。

    Java中的基本数据类型在栈内存里

    当我们定义了一个基础类型的数据变量的时候,

    如 int a =10 ; java虚拟机会在栈内存开辟内存空间存储10这个值,并且把10这个字面量拷贝给a

    当我们再次定义一个变量 如 int b=10;这时因为栈内存已经有10这个值了,所以直接把10这个字面量拷贝给b

    所以当我们使用 a==b 的时候 得到的结果是true。

    引用数据类型的比较

    引用数据类型定义变量,也就是创建对象的时候通常使用new关键字。

    如 User user1 = new User("小明");

    User user2= new User("小明")

    在我们使用new关键字创建对象的时候,会在堆内存中开辟空间,给属性赋值

    最后再把对应的内存的地址赋给左边的引用,也就是user1和user2。所以实际上我们的user1和user2 实际上存储的收拾一个具体的内存地址。

    引用类型的数据比较的时候 如果用 == 去比较,实际是去比较他们的内存地址。

    如user1 ==user2 实际上就是看user1和user2是不是指向同一块内存地址,答案是当然不是,所以结果是false。

    引用类型的equals方法比较

    实际上在我们的项目中,不是特别关心user1 和user2是不是指向同一块内存地址,我们只关心我们在意的一些属性是不是相等。就象如果你是个妹子,如果有个象彭于晏一模一样的男生站在你面前,即使你知道他不是彭于晏,你还是忍不住想和他谈恋爱。因为你在意的身高,笑容,腹肌(这些在Java里面叫属性)和彭于晏是一模一样的,那么你可以认为他们就是同一个人。

    equlas方法的作用就是这样的,通过这个方法来指定或者制定你的规则,你认为什么情况下两个对象相等,什么情况下两个对象不相等的规则。equlas方法是从Object继承而来的,所以默认还是通过== 去比较,当然也就还是比较内存地址,所以你可以根据业务需要,来重写这个equals方法,来制定属于你的比较规则。

    hashCode方法

    上面是摘抄的jdk对于equals() 和 hashCode()这两个方法的说明,大意就是如果你重写了equals方法,那么你也应该重写hashCode方法,来保证

    如果 user1.equals(user2 )  ==  true ,那么user1.hashCode() ==user2.hashCode()。

    特殊说明

    但是String以及包装类如Integer,我们在创建对象的时候是直接通过 = 赋值创建,那些类的实例比较应该怎么比较呢? 既然它们是引用类型,那么比较当然应该用 equals 方法去比较。

    下一篇文章会详细说明他们和普通的其他类创建对象有什么区别。

    相关文章

      网友评论

          本文标题:Java中的相等比较

          本文链接:https://www.haomeiwen.com/subject/qhjrnxtx.html