【199期】100%会用到的hashCode()和equals()方法及使用规范,你掌握了吗?

点击上方“Java面试题精选”,关注公众号

面试刷图,查缺补漏

>>号外:往期面试题,10篇为一个单位归置到本公众号菜单栏->面试题,有需要的欢迎翻阅

阶段汇总集合:001期~180期汇总,方便阅读(增加设计模式)

背景

在看阿里巴巴Java开发手册手册时,看到了有关hashCode()和equals()方法的使用规范。

  • 只要重写 equals,就必须重写 hashCode。
  • 因为 Set 存储的是不重复的对象,依据 hashCode 和 equals 进行判断,所以 Set 存储的对象必须重写这两个方法。
  • 如果自定义对象做为 Map 的键,那么必须重写 hashCode 和 equals。

并且举了String 重写了 hashCode 和 equals 方法,所以我们可以非常愉快地使用 String 对象作为 key 来使用的例子。

我们看下String的hashCode()和equals()的源码:

String的hashCode()

hashCode():

这一点和第二点实际上是一样的,这里就不举例介绍了。 
实际上,Set的对象和Map的key的操作和hashCode以及equals方法有关,比如查这个对象是否在Set里,先根据hashCode定位到一个段,在根据equals进行确定是否存在,这样不需要把Set里所有的对象都遍历一遍,效率太低,Map的key是同样道理。

那么hashCode和equals的设计原则就呼之欲出了。

equals()的设计原则

  • 对称性: 如果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。

hashCode()的设计原则

  • 在一个Java应用的执行期间,如果一个对象提供给equals做比较的信息没有被修改的话,该对象多次调用hashCode()方法,该方法必须始终如一返回同一个integer。
  • 如果两个对象根据equals(Object)方法是相等的,那么调用二者各自的hashCode()方法必须产生同一个integer结果。
  • 并不要求根据equals(java.lang.Object)方法不相等的两个对象,调用二者各自的hashCode()方法必须产生不同的integer结果。然而,程序员应该意识到对于不同的对象产生不同的integer结果,有可能会提高hash table的性能。

END

来源:github.com/feigeswjtu/java-basics/edit/master/sourceCode

十期推荐

【181期】HashMap 面试二十一问!

【182期】SpringCloud常见面试题(2020最新版)

【183期】面试官:线上服务平均响应时间太长,怎么排查?

【184期】SQL数据库面试题以及答案(50例题)

【185期】面试官:你能说说 Synchronized实现对象锁的两种方式以及它的原理吗?

【186期】一口气说出 Synchronized 同步方法的八种使用场景

【187期】出现几率比较大的Redis面试题(含答案)

【188期】面试官:delete、truncate、drop的区别有哪些,该如何选择

【189期】delete后加 limit是个好习惯么

【190期】MQ消息中间件,面试能问写什么?


与其在网上拼命找题? 不如马上关注我们~

【199期】100%会用到的hashCode()和equals()方法及使用规范,你掌握了吗?

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/7621.html

(0)
小半的头像小半

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!