Java中的equals()、==和hashCode()的用法区别

这篇文章主要介绍“Java中的equals()、==和hashCode()的用法区别”,在日常操作中,相信很多人在Java中的equals()、==和hashCode()的用法区别问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java中的equals()、==和hashCode()的用法区别”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

成都创新互联公司专注为客户提供全方位的互联网综合服务,包含不限于成都网站设计、网站建设、外贸网站建设、龙川网络推广、微信小程序开发、龙川网络营销、龙川企业策划、龙川品牌公关、搜索引擎seo、人物专访、企业宣传片、企业代运营等,从售前售中售后,我们都将竭诚为您服务,您的肯定,是我们最大的嘉奖;成都创新互联公司为所有大学生创业者提供龙川建站搭建服务,24小时服务热线:028-86922220,官方网址:www.cdcxhl.com

equals()

equals() 的作用是用来判断两个对象是否相等。它定义在 JDK 的 Object 类中。源码如下:

Java中的equals()、==和hashCode()的用法区别

由于 Object 类是所有类基类,所以所有的 Java 类都有 equals() 方法。只不过默认的 equals() 方法,等价于 ==。Object 类中的 equals() 方法默认是通过判断两个对象的地址是否相等(即,是否是同一个对象)来区分它们是否相等的。

因此,我们通常会重写 equals() 方法。若某个类没有覆盖 equals() 方法,当通过它的 equals() 比较两个对象时,实际上是比较两个对象是不是同一个对象。这时,等价于通过“==”去比较这两个对象。当我们覆盖了类的 equals() 方法后,通过 equals() 方法比较两个对象是否相等。比较的是两个对象的内容相等,若相等则 equals() 方法返回 true;否则返回 fasle。

Java 的 equals() 有 5 大特性:

  • 对称性:如果x.equals(y)返回是"true",那么y.equals(x)也应该返回是"true"。

  • 反射性:x.equals(x)必须返回是"true"。

  • 类推性:如果x.equals(y)返回是"true",而且y.equals(z)返回是"true",那么z.equals(x)也应该返回是"true"。

  • 一致性:如果x.equals(y)返回是"true",只要x和y内容一直不变,不管你重复x.equals(y)多少次,返回都是"true"。

  • 非空性:x.equals(null),永远返回是"false";x.equals(和 x 不同类型的对象)永远返回是"false"。

所以,我们在重写 equals() 方法的时候,一定要检验检验是否达到了上面的 5 大特性。这 5 大特性也被称为 equals() 的 5 大重写规则。

==

== 的作用是判断两个对象的地址是不是相等。即,判断两个对象是不试同一个对象。

面试的时候,基本上都会问到 equals 方法与‘==’运算符有什么区别?如果你回答的是:“equals 比较的是对象的内容,而‘==’比较的是对象的地址”。那么这个答案严格来说是错误的,至少是不完全正确吧。

通过前面的内容我们知道 equals 方法在 Object 中的实现也是直接的使用了‘==’运算符进行比较的。所以回答这个问题一定要严谨,加上前置条件。

hashCode()

hashCode() 的作用是获取哈希码,也称为散列码;它实际上是返回一个 int 整数。一般在 hash 集合中会用到。hashCode() 统一定义在 JDK 的 Object 中,这就意味着 Java 中的任何类都包含有 hashCode() 函数。

那么为什么重写 equals() 的同时还得重写 hashCode() 呢?就是因为 HashMap,Hashtable,HashSet 等集合在处理键对象的哈希码来计算存储位置的时,并不能保证 hash 不冲突。另外在 equals() 方法相等的时候,hashCode() 也不一定相等。

但是在使用散列表时,我们要求如果两个对象的 equals() 相等,那么它们的 hashCode() 的话, 值一定相同。如果两个对象 hashCode() 相等,它们的 equals() 并不一定相等。

因为在散列表中,hashCode() 相等,即两个键值对的哈希值相等。然而哈希值相等,并不一定能得出键值对相等。补充说一句:“两个不同的键值对,哈希值相等”,这就是哈希冲突。

我们知道 HashSet 是一个不允许存储重复元素的集合,但是如果你没有重写元素类的 equals() 和 hashCode() 的话,HashSet 基本上就失去了意义。这也是为什么很多同学误用 HashSet,但并没有用出自己想要的结果的原因。

到此,关于“Java中的equals()、==和hashCode()的用法区别”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注创新互联网站,小编会继续努力为大家带来更多实用的文章!


文章标题:Java中的equals()、==和hashCode()的用法区别
本文链接:http://azwzsj.com/article/jsosdj.html