Effective Java笔记(11)覆盖 equals 时总要覆盖 hashCode

这篇具有很好参考价值的文章主要介绍了Effective Java笔记(11)覆盖 equals 时总要覆盖 hashCode。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

        在每个 覆盖了 equals 方法的类中,都 必须 覆盖 hashCode 方法 。 如果不这样做的话,就会违反 hashCode 的通用约定,从而导致该类无法结合所有基于散列的集合一起正常运作,这类集合包括 HashMap 和 HashSet 。 下面是约定的内容,摘自 Object 规范:

  • 1、在应用程序的执行期间,只要对象的 equals 方法的比较操作所用到的信息没有被修改,那么对同一个对象的多次调用,hashCode 方法都必须始终返回同一个值 。在一个应用程序与另一个程序的执行过程中,执行 hashCode 方法所返回的值可以不一致 。
  • 2、如果两个对象根据 equals(Object )方法比较是相等的,那么调用这两个对象中的 hashCode 方法都必须产生同样的整数结果 。
  • 3、如果两个对象根据 equals(Object )方法比较是不相等的,那么调用这两个对象中的 hashCode 方法,则不一定要求 hashCode 方法必须产生不同的结果 。 但是程序员应该知道,给不相等的对象产生截然不同的整数结果,有可能提高散列表( hash table )的性能 。

        因没有覆盖 hashCode 而违反的关键约定是 第二条:相等的对象必须具有相等的散到码( hash code ) 。 根据类的 equals 方法,两个截然不同的实例在逻辑上有可能是相等的,但是根据 Object 类的 hashCode 方法,它们仅仅是两个没有任何共同之处的对象 。因此,对象的 hashCode 方法返回两个看起来是随机的整数,而不是根据第二个约定所要求的那样,返回两个相等的整数 。

        不要试图从散列 码计算 中排 除掉一个对 象 的 关键域来提高性能 。 虽然这样得到的散列函数运行起来可能更快,但是它的效果不见得会好,可能会导致散列表慢到根本无法使用 。特别是在实践中,散列函数可能面临大量的实例,在你选择忽略的区域之中,这些实例仍然区别非常大 。 如果是这样,散列函数就会把所有这些实例映射到极少数的散列码上,原本应该以线性级时间运行的程序,将会以平方级的时间运行 。

        不要对 hash Code 方法的返回值做出具体的规定,因此客户端无法理所当然地依赖它;这样可以为修改提供灵活性 。Java 类库中的许多类,比如 String 和 Integer ,都可以把它们的 hashCode 方法返回的确切值规定为该实例值的一个函数。一般来说,这并不是个好主意,因为这样做严格地限制了在未来的版本中改进散列函数的能力 。 如果没有规定散列函数的细节,那么当你发现了它的内部缺陷时,或者发现了更好的散列函数时·,就可以在后面的发行版本中修正它 。

        总而言之,每当覆盖 equals 方法时都必须覆盖 hashCode ,否则程序将无法正确运行 。
hashCode 方法必须遵守 Object 规定的通用约定,并且必须完成一定的工作,将不相等的散列码分配给不相等的实例 。 文章来源地址https://www.toymoban.com/news/detail-558572.html

到了这里,关于Effective Java笔记(11)覆盖 equals 时总要覆盖 hashCode的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Effective Java笔记(6)避免创建不必要的对象

            一般来说,最好能重用单个对象,而不是在每次需要 的时候就创建一个相同功能的新对象 。 重用方式既快速,又流行 。 如果对象是不可变的( immutable ) (详见第 17 条),它就始终可以被重用 。         作为一个极端的反面例子,看看下面的语句 :    

    2024年02月15日
    浏览(39)
  • Effective Java笔记(3)用私有构造器或者枚举类型强化 Singleton 属性

            Singleton 是指仅仅被实例化一次的类 。Singleton 通常被用来代表一个无状态的对象,如函数,或者那些本质上唯一的系统组件 。 使类成为 Singleton会使它的害户端测试变得十分困难 ,因为不可能给 Singleton 替换模拟实现,除非实现一个充当其类型的接口 。      

    2024年02月15日
    浏览(51)
  • Effective Java笔记(9)try-with-resources 优先于 try -finally

            Java 类库中包括许多必须通过调用 close 方法来手工关闭的资源 。 例如 InputStream 、OutputStream 和 java.sql.Connection 。 客户端经常会忽略资源 的关闭 ,造成严重的性能后果也就可想而知了 。 虽然这其中的许多资源都是用终结方法作为安全网,但是效果并不理想。  

    2024年02月15日
    浏览(52)
  • Effective Java笔记(16)要在公有类而非公有域中使用访问方法

            有时候,可能需要编写一些退化类,它们没有什么作用,只是用来集中实例域 :         由于这种类的数据域是可以被直接访问的,这些类没有提供 封装 ( encapsulation )的功能。 如果不改变 API,就无法改变它的数据表示法, 也无法强加任何约束条件;当域

    2024年02月16日
    浏览(41)
  • Win11音频设置和Equalizer设置经验分享

    自己捣鼓了半天的音频设置,网上也没有太多教程指引,踩了好多坑,和大家分享一下。 使用场景:Win11系统游戏本,菲利普SHP9500耳机,Equalizer APO x64 1.3 先介绍一下Win11的音频设置界面,主要有三项,格式(采样率),音频增强,空间音频,逐项分析一下。 采样率和位深度

    2024年02月07日
    浏览(50)
  • effective c++ 笔记

    TODO:还没看太懂的篇章 item25 item35 模板相关内容 可以将C++视为以下4种次语言的结合体: C 面向对象 模板 STL 每个次语言都有自己的规范,因此当从其中一个切换到另一个时,一些习惯或守则是可能会发生变化的。 用const替换#define有以下2个原因: #define定义的符号名称可能没

    2024年02月10日
    浏览(28)
  • C++笔记-effective stl

    熟悉stl本身 慎重选择stl容器,每一种stl容器对应不同的使用场景,比如deque往往比vector更加合适 封装stl容器,积极的使用stl,可以高效的使用它 积极使用其对应迭代器使用的函数,比如做相加运算使用accumulate替代for循环,可以更加高效 调用对应的函数的时候,不使用过于复

    2024年01月18日
    浏览(42)
  • effective c++ 笔记 条款18-25

    使用外覆类型(wrapper)提醒调用者传参错误检查,将参数的附加条件限制在类型本身 三个参数类型相同的函数容易造成误用 导入新的类型 限制取值 从语法层面限制调用者不能做的事 operate*的返回类型上加上const修饰,防止无意的错误赋值if (a * b = c) 接口应表现出与内置类型

    2024年02月21日
    浏览(43)
  • More Effective C++学习笔记(1)

    在任何情况下都 不能使用指向空值的引用 。一个引用必须总是指向某个对象,必须有初值。 如果变量指向 可修改,且有可能指向null ,就把变量设为 指针 ;如果变量 总是必须代表一个对象(不可能为null) ,就把变量设为 引用 。 引用可能比指针更高效 ,因为不必像指针

    2024年02月12日
    浏览(54)
  • java八股文面试[java基础]—— hashCode 与 equals 区别 == 与 equals的区别

    两个对象的hashCode()相同时,equals()相等吗?_两个对象的hashcode一样,equal一样么_不想当个程序员的博客-CSDN博客 equals():比较的是非基本类型的数据的引用地址(即内存地址)是否相同,但是对于重写equals方法的类型,比较的是对象内容是否相同。 hashCode():计算对象实例的哈

    2024年02月12日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包