结论是:如果重写equals方法却不重写hashcode方法会使哈希表没有意义,同时也违反了java hashcode设计原则(equals相同,hashcode也必须相同),会导致相同的元素重复放入哈希表。
- 首先哈希表的定义如下:给定表M,存在函数f(key),对任意给定的关键字值key,代入函数后若能得到包含该关键字的记录在表中的地址,则称表M为哈希(Hash)表,函数f(key)为哈希(Hash) 函数。
- 其次,从概念上来讲,关键值key应该代表元素的关键信息,如果关键值key不同,那么应该代表着元素也不同。当我们重写equals,会将对象的地址对比改变为自定义关键信息对比。此时关键值key应该是我们自定义的关键信息,而不是hashcode默认的内存地址相关信息。所以我们需要根据自定义关键信息重写hashcode
哈希码的通用约定如下:
- 在java程序执行过程中,在一个对象没有被改变的前提下,无论这个对象被调用多少次,hashCode方法都会返回相同的整数值。对象的哈希码没有必要在不同的程序中保持相同的值。
- 如果2个对象使用equals方法进行比较并且相同的话,那么这2个对象的hashCode方法的值也必须相等
- 如果根据equals方法,得到两个对象不相等,那么这2个对象的hashCode值不需要必须不相同。但是,不相等的对象的hashCode值不同的话可以提高哈希表的性能。
|