HashSet为什么要同时重写equals()和hashCode()
为什么要重写hashcode?
装逼版
在hashset集合中不允许有两个完全相同的对象,插入的时候如果判断相同则会进行覆盖。
这时候如果只重写了equals的方法而不重写hashcode的方法,Object中hashcode是根据对象的存储地址转换而形成的一个哈希值。
这时候就有可能因为没有重写hashcode方法,造成相同的对象散列到不同的位置而造成对象的不能覆盖的问题。
白话版
存储6个对象,有2个对象的姓名和年龄都相同。如果不重写,那么是根据对象的地址值来计算哈希值的,哈希值不同所以6个对象都会打印出来。现在想让6个对象中姓名和年龄相同的对象不显示,就必须要重写hashcode让不同对象的哈希值相同,又因为hashset集合是根据hash值来存储元素,这样就可以实现目标了。
为什么还要重写equals()?
装逼版
因为要解决哈希冲突的问题。
为什么会出现哈希冲突呢?
因为我们申请的数组是有限长度的,把无限的数字映射到有限的数组上早晚会出现冲突,即多个元素映射到同一个位置上。
白话版
重写的目的是 哈希值相同的对象equals不一定一样,equals的两个对象hash值一定相同
鸣谢
@Mero
@Rc
@ 行者孙
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理