一:什么是equal和hashcode
在Java钟equals()和hashcode()方法通常是成对的,它们在使用都是基于hash机制的数据结构非常重要,类如hashmap、hashSet和hashtable等。
- 根据Java的文档,如果两个对象通过
equals(Object obj)
方法比较是相等的,那么调用这两个对象中任一对象的hashCode()
方法必须产生相同的整数结果。 - 如果两个对象通过
equals(Object obj)
方法比较是不相等的,那么调用这两个对象的hashCode()
方法不要求一定产生不同的整数结果。但是,为不相等的对象生成不同的哈希码可以提高哈希表的性能。
二、原因
为什么需要这样做?
- 提高集合框架的性能:
- 当你在使用基于哈希的集合(如
HashSet
或HashMap
)时,集合内部会根据元素的哈希码来确定元素在集合中的存储位置(桶)。 - 如果不重写
hashCode()
,那么即使你重写了equals()
,HashSet
或HashMap
等集合也可能无法正确地根据equals()
的比较结果来区分对象,因为它们可能会基于对象的默认哈希码(通常是对象的内存地址)来比较和存储对象。 - 这将导致即使两个对象通过
equals()
比较是相等的,它们也可能被存储在集合的不同位置,从而导致集合的行为不符合预期。
- 当你在使用基于哈希的集合(如