zoukankan      html  css  js  c++  java
  • 覆盖equals 时总要覆盖hashCode(9)

    1、在每个覆盖了equals 方法的类中,也必须覆盖hashCode

    • 这是关于hashCode 的通用约定
    • 这样可以与 基于散列的集合一起工作,比如:HashMap、HashSet、HashTable

    2、Object 规范:

    • 在应用程序执行期间,equals 比较的信息不变,对同一对象多次调用,hashCode 返回同一整数
    • 在同一应用程序的多次执行中,hashCode 返回整数可以不一致
    • 两个对象equals 比较相等,hashCode 必须相等
    • 两个对象equals 不等,hashCode不一定不等
    • 不等的hashCode会提高散列集合的性能

    3、相等的对象必须有相等的hashCode 

    • 散列集合中,先比较hashCode ,相等才做equals 比较
    • 编写一个合法,但不好用的hashCode 是没有任何意义 ,如下:
    • 散列表退化为链表

    083715_Pa7y_3847203.png

    4、好的散列函数,倾向于(不保证):为每一个不等的对象产生不等的hashCode

    • 对每一个关键域(equals 方法比较的域),都做散列计算,并且合并为一个
    • 对于冗余域(equals 比较没用到的域),必须排除在外
    • 如果一个类包含多个相似的域,用乘法计算散列值效果会更好
    • 如下,但会一个简单的、确定的结果

    091511_YgX5_3847203.png

    5、对于不可变类,计算hashCode 消耗大,可以考虑缓存hashCode

    6、如果某类型大多数对象都会用作散列键,可以创建时就计算hashCode

    • 否则,可以考虑延时计算hashCode

    092101_vNEY_3847203.png

    092114_I9Jx_3847203.png

    7、不要在计算hashCode 的时候 排除掉对象的关键部分 来提升性能

    • 这里省事,可能会导致hashCode 不起作用

    8、不要在程序中,依赖hashCode返回的确定值

    • 这样会限制在以后版本改进hashCode 函数的能力

    转载于:https://my.oschina.net/u/3847203/blog/1818445

  • 相关阅读:
    CSS中可以通过哪些属性定义,使得一个DOM元素不显示在浏览器可视范围内?
    贝塞尔曲线
    A little composer
    ABAQUS操作笔记
    ABAQUS薄板实例
    引用
    引用、重载、递归概念及应用
    Photoshop图片处理-云毕业照
    图片存储大小更改
    论文公式之“公式居中,序号在右”
  • 原文地址:https://www.cnblogs.com/twodog/p/12136830.html
Copyright © 2011-2022 走看看