zoukankan      html  css  js  c++  java
  • 重写equals为什么要重写hashcode

     三个方面去理解“重写equals为什么要重写hashcode”:

    1.Object中hashCode()的源码注释

    1. 源码 hashCode()的注释的最后一段的括号中写道:将对象的地址值映射为integer类型的哈希值。

    2. 源码 equals()的注释:当我们将equals方法重写后有必要将hashCode方法也重写,这样做才能保证不违背hashCode方法中“相同对象必须有相同哈希值”的约定。

    3. Object类中的equals方法区分两个对象的做法是比较地址值,即使用“==”。而我们如若根据业务需求改写了equals方法的实现,那么也应当同时改写hashCode方法的实现。否则hashCode方法依然返回的是依据Object类中的依据地址值得到的integer哈希值。

    2.从String的equals()方法去看

    1. String对象在调用equals方法比较另一个对象时,除了认定相同地址值的两个对象相等以外,还认定对应着的每个字符都相等的两个String对象也相等,即使这两个String对象的地址值不同(即属于两个对象)。
    2. String类中对equals方法进行重写扩充了,但是如果此时我们不将hashCode方法也进行重写,那么String类调用的就是来自顶级父类Obejct类中的hashCode方法。即,对于两个字符串对象,使用他们各自的地址值映射为哈希值,导致结果最后不同。

    3.从集合类的源码中去看

    1. HashMap存储数据的时候,是取的key值的哈希值,然后计算数组下标,采用链地址法解决冲突,然后进行存储。
    2. 取数据的时候,依然是先要获取到哈希值,找到数组下标,然后for遍历链表集合,进行比较是否有对应的key。


    参考链接:
    https://zhuanlan.zhihu.com/p/50206657
    https://www.jianshu.com/p/0e1176a9bad1
    https://blog.csdn.net/xl_1803/article/details/80445481 (这篇文章下面评论较多)

    天助自助者
  • 相关阅读:
    高等数学(完结版)
    数据结构(c语言描述)
    leetcode-mid- 50. Pow(x,n)-NO
    leetcode-mid-math
    leetcode-mid-math-202. Happy Number-NO
    leetcode-mid-dynamic programming- Longest Increasing Subsequence-NO
    leetcode-mid-design-380. Insert Delete GetRandom O(1)
    leetcode-mid-design-297. Serialize and Deserialize Binary Tree¶-NO -??
    leetcode-mid-dynamic programming-322. Coin Change
    leetcode-mid-dynamic programming-62. Unique Paths
  • 原文地址:https://www.cnblogs.com/ZeGod/p/13320785.html
Copyright © 2011-2022 走看看