HashSet为什么要同时重写equals()和hashCode()
为什么要重写hashcode?
装逼版
在hashset集合中不允许有两个完全相同的对象,插入的时候如果判断相同则会进行覆盖。
这时候如果只重写了equals的方法而不重写hashcode的方法,Object中hashcode是根据对象的存储地址转换而形成的一个哈希值。
这时候就有可能因为没有重写hashcode方法,造成相同的对象散列到不同的位置而造成对象的不能覆盖的问题。
白话版
存储6个对象,有2个对象的姓名和年龄都相同。如果不重写,那么是根据对象的地址值来计算哈希值的,哈希值不同所以6个对象都会打印出来。现在想让6个对象中姓名和年龄相同的对象不显示,就必须要重写hashcode让不同对象的哈希值相同,又因为hashset集合是根据hash值来存储元素,这样就可以实现目标了。
为什么还要重写equals()?
装逼版
因为要解决哈希冲突的问题。
为什么会出现哈希冲突呢?
因为我们申请的数组是有限长度的,把无限的数字映射到有限的数组上早晚会出现冲突,即多个元素映射到同一个位置上。
白话版
重写的目的是 哈希值相同的对象equals不一定一样,equals的两个对象hash值一定相同
鸣谢
@Mero
@Rc
@ 行者孙
浙公网安备 33010602011771号