在Java中,equlas()和hashCode()是Obkect类的两个方法,它们经常一起使用以实现对象的不教以及哈希存储。
euulas()方法:
- equlas()方法用于比较两个对象是否在逻辑上相等
- 在Object类中,equlas()方法默认实现为比较两个对象的引用是否相等,即比较内存地址
- 一般情况下,需要根据具体的业务逻辑来重写equlas()方法,以实现对对象内容的比较
hashCode()方法
- hashCode()方法返回对象的哈希码,用于在哈希表等数据结构中存储对象
- 对于使用哈希表存储的对象,在重写equlas()方法时通常也需要重写hashCode()方法,以保证相等的对象具有相同的哈希码(HashCOde)
- 一般情况下,相等的对象应该具有相同的哈希码,但相同哈希码的对象不一定相等
问题
问题一:为什么在重写 equals 方法的时候需要重写 hashCode 方法?
答:因为有强制的规范指定需要同时重写equlas和hashCode方法,许多容器,如 HashMap、HashSet都依赖于equlas和hashCode的规定。
问题二:为什么两个不同的对象可能有相同的hash哈希码(hashCode)?
答:这种情况称为哈希冲突因为哈希码的计算是依赖于对象的属性的状态进行的,而不仅仅取决于对象的唯一标识。
默认情况下,hashCode()方法基于对象的内存地址进行计算,因此,对于不同对象,它们在内存中的地址是不同的,所以哈希码也会不同。
然而,通过重写自定义的hashCode()方法,我们可以自定义哈希码的计算方法,在实现自定义hashCode()方法时,我们可能只考虑对象的部分属性和状态,而不是整个对象,这样就有可能出现不同的对象有相同的哈希码。
还有就是,哈希码的范围是有限的,而对象的数量是无限的,所以也会出现多个对象映射到相同的哈希码的情况。