『Java 语法基础』对 equals() 和 hashCode() 的理解

为什么在重写 equals 方法的时候需要重写 hashCode 方法

因为有强制的规范指定需要同时重写 hashcode 与 equals 方法,许多容器类,如 HashMap、HashSet 都依赖于 hashcode 与 equals 的规定。

在Java中,equals()hashCode() 方法是 Object 类的两个非常重要的方法,它们用于比较对象的相等性以及计算对象的哈希码。

equals() 方法用于判断两个对象是否逻辑上相等,也就是两个对象的内容是否相同。它通常需要根据实际情况在子类中重写,以提供正确的相等性逻辑。默认情况下(如 Object 类中的实现),equals() 方法比较对象的内存地址,也就是说,只有同一个对象才被认为是相等的。

hashCode() 方法则用于计算对象的哈希码,它被用于散列数据结构,如 HashSetHashMap 等。在散列数据结构中,对象的哈希码通常被用来决定对象应该存放的位置。

根据 Java 规范,有关 equals()hashCode() 的重要契约包括:

  1. 如果两个对象相等,那么它们的 hashCode() 方法必须返回相同的整数。
  2. 如果两个对象的 hashCode() 方法返回相同的整数,这并不要求它们一定相等,但散列表的效率可能受到影响。

之所以在重写 equals() 方法时必须同时重写 hashCode() 方法,是为了维持这两个方法之间的一致性。如果两个对象是相等的,但它们的哈希码不相同,这将违反 hashCode() 方法的契约,可能导致无法正确地存取散列数据结构中的对象。例如,在使用 HashMap 时,如果两个键对象相等,它们必须具有相同的哈希码,否则可能会导致其中一个对象无法被正确地找到。

有没有可能两个不相等的对象有相同的 hashcode?

有可能,即使两个对象不相同,它们也可能具有相同的 hashCode 值,这称为哈希冲突。哈希冲突是散列算法的一个固有属性,因为散列码是将对象信息映射到一个有限的整数域上。由于这个整数域范围的限制,相对于可能的对象状态来说是不足够的,从而导致不同对象间的哈希值可能相同。

Java语言规范中关于 hashCode 的合同确实指出,如果两个对象相同,则它们的哈希码一定相同,但并未规定不同的对象必须产生不同的哈希码。因此,在基于哈希的数据结构中,如 HashMap,便可能出现哈希碰撞。在这种情况下,HashMap 会使用 链表红黑树 来管理相同哈希码的不同键,确保了即便发生了哈希碰撞,也能通过 equals() 方法准确地区分和处理这些键。

因此,为了确保诸如 HashMapHashSet 这样的基于哈希的集合能够正确且高效地运作,合理地实现 hashCodeequals 方法以及妥善处理哈希冲突是至关重要的。

两个相同的对象会有不同的 hash code 吗?

不能,根据 hash code 的规定,这是不可能的。

在 Java 中,当你重写一个类的 equals() 方法时,根据 Java 的规范,你也必须重写 hashCode() 方法,以保证同一个类的两个相等的对象(即 equals() 方法返回 true)返回相同的 hash code 值。这是因为 Java 中的集合类,如 HashMapHashSet,依赖于 hashCode()equals() 方法来确定对象的唯一性。

如果两个对象根据 equals(Object) 方法是相等的,那么它们的 hashCode()方 法也必须返回相同的整数值。如果没有重写 hashCode(),那么默认的 Object 类的实现将产生基于对象内存地址的 hash code,这可能会违反这一规定,并且在使用哈希表的过程中导致性能下降。所以重写 equals() 时一定要同步重写 hashCode(),以确保行为的一致性。

posted @   BNTang  阅读(18)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 为DeepSeek添加本地知识库
· 精选4款基于.NET开源、功能强大的通讯调试工具
· DeepSeek智能编程
· 大模型工具KTransformer的安装
· [计算机/硬件/GPU] 显卡
  1. 1 总会有人离开 王巨星
  2. 2 月亮 孟凡明
  3. 3 迟里乌布
  4. 4 我只能离开 颜人中
  5. 5 达尔文 蔡健雅
  6. 6 夜色滚烫 叶明净
  7. 7 你的星环 路飞文
  8. 8 不再说话 三块木头
  9. 9 黄昏 粥粥和小伙/粥粥
  10. 10 爱不单行 刘大拿
  11. 11 心动贩卖机 PIggy
  12. 12 别来无恙 苏星婕
  13. 13 我们的歌 刘大拿
  14. 14 一直很安静 王贰浪
  15. 15 去有风的地方 清音
  16. 16 雪 Distance Capper/罗言
  17. 17 坏女孩 徐良/小凌
  18. 18 乐园 沧桑Cang333/虎皮蛋/曲甲
  19. 19 Ayo(Explicit) Chris Brown/Tyga
  20. 20 我的美丽feat.海洋Bo 海洋Bo/高睿
  21. 21 世事可爱 粥粥和小伙/粥粥
  22. 22 我记得 赵雷
  23. 23 我想牵着你的手 许嵩
  24. 24 人们都不懂 刘诺然
  25. 25 寻一个你(电视剧《苍兰诀》温情主题曲) TTTTTeehom
  26. 26 子莫格尼 杉和
  27. 27 Cat Cafe Shoffy
  28. 28 风停了雨停了我们还拥抱着 Superluckyqi
  29. 29 寂寞沙洲冷 于潼
  30. 30 三国恋 王巨星
  31. 31 达尔文 林俊杰
  32. 32 有些 颜人中
  33. 33 小模样 张小只ya
  34. 34 是否 程响
  35. 35 楼顶上的小斑鸠 队长
  36. 36 笑场 薛之谦
  37. 37 还是分开 张叶蕾
  38. 38 修炼爱情 林俊杰
  39. 39 二零三 毛不易
  40. 40 雅俗共赏 许嵩
  41. 41 Serendipity 古瑞斯Graps/Zakiya晴子
  42. 42 就让这大雨全都落下·2023 刘大拿
  43. 43 老男孩 筷子兄弟
  44. 44 有何不可 许嵩
  45. 45 缓缓 杜宣达
  46. 46 好久不见 陈奕迅
  47. 47 爱的魔法(Cover 金莎) 封茗囧菌
  48. 48 在你的身边 盛哲
  49. 49 带我去找夜生活 告五人
  50. 50 假面舞会 很美味
  51. 51 STAY The Kid LAROI/Justin Bieber
  52. 52 我好想睡觉的 无敌西红柿
  53. 53 日不落(温柔版)
  54. 54 恋爱画板 锦零
  55. 55 7710 好乐无荒/尹露浠
  56. 56 给你呀(又名:for ya) 蒋小呢
  57. 57 Love Story Taylor Swift
  58. 58 Plain Jane(Remix 13z) 鱼幼微
  59. 59 晚风 7opy/BT07
  60. 60 拜托 孙晨
  61. 61 乌梅子酱 李荣浩
  62. 62 南半球与北海道 范倪Liu
  63. 63 星河万里 Rom邢锐
黄昏 - 粥粥和小伙/粥粥
00:00 / 00:00
An audio error has occurred, player will skip forward in 2 seconds.

作词 : 陈信荣

作曲 : 周传雄

依然记得从你眼中滑落的泪

伤心欲绝

混乱中有种热泪烧伤的错觉

过完整个夏天

忧伤并没有好一些

开车行驶在公路无际无边

有离开自己的感觉

唱不完一首歌

疲倦还剩下黑眼圈

感情的世界伤害在所难免

黄昏再美终要黑夜

依然记得从你口中说出再见

坚决如铁

昏暗中有种烈日灼身的错觉

黄昏的地平线

划出一句离别

爱情进入永夜

依然记得从你眼中滑落的泪

伤心欲绝

混乱中有种热泪烧伤的错觉

黄昏的地平线

割断幸福喜悦

相爱已经幻灭

唱不完一首歌

疲倦还剩下黑眼圈

感情的世界伤害在所难免

黄昏再美终要黑夜

依然记得从你口中说出再见

坚决如铁

昏暗中有种烈日灼身的错觉

黄昏的地平线

划出一句离别

爱情进入永夜

依然记得从你眼中滑落的泪

伤心欲绝

混乱中有种热泪烧伤的错觉

黄昏的地平线

割断幸福喜悦

相爱已经幻灭

原唱 : 周传雄

点击右上角即可分享
微信分享提示