Java中的相等比较
说一说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 方法去比较。
下一篇文章会详细说明他们和普通的其他类创建对象有什么区别。