• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录

gabiandlizzy

  • 博客园
  • 联系
  • 订阅
  • 管理

公告

View Post

HashSet为什么要同时重写equals()和hashCode()

为什么要重写hashcode?

装逼版

在hashset集合中不允许有两个完全相同的对象,插入的时候如果判断相同则会进行覆盖。
这时候如果只重写了equals的方法而不重写hashcode的方法,Object中hashcode是根据对象的存储地址转换而形成的一个哈希值。
这时候就有可能因为没有重写hashcode方法,造成相同的对象散列到不同的位置而造成对象的不能覆盖的问题。

白话版

存储6个对象,有2个对象的姓名和年龄都相同。如果不重写,那么是根据对象的地址值来计算哈希值的,哈希值不同所以6个对象都会打印出来。现在想让6个对象中姓名和年龄相同的对象不显示,就必须要重写hashcode让不同对象的哈希值相同,又因为hashset集合是根据hash值来存储元素,这样就可以实现目标了。

为什么还要重写equals()?

装逼版

因为要解决哈希冲突的问题。
为什么会出现哈希冲突呢?
因为我们申请的数组是有限长度的,把无限的数字映射到有限的数组上早晚会出现冲突,即多个元素映射到同一个位置上。

白话版

重写的目的是 哈希值相同的对象equals不一定一样,equals的两个对象hash值一定相同

鸣谢
@Mero
@Rc
@ 行者孙

posted on 2022-04-06 10:22  大妖怪金角大王  阅读(134)  评论(0)    收藏  举报

刷新页面返回顶部
 
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3