Java中的HashMap使用hashCode()和equals()方法来确定键值对的索引,当根据键获取值的时候也会用到这两个方法。
如果没有正确的实现这两个方法,两个不同的键可能会有相同的hash值,因此可能会被集合认为是相等的。
而且,这两个方法也用来发现重复元素,所以这两个方法的实现对HashMap的精确性和正确性是至关重要的。
HashMap的很多函数要基于hashCode()方法和equals()方法,hashCode()用来定位要存放的位置,equals()用来判断是否相等。
相等的概念是什么?
Object的equals()只是简单地判断是不是同一个实例,但是有时候我们想要的是逻辑上的相等。比如一个学生类Student,有一个成员变量studentID,只要StudentID相等,不是同一个实例我们也认为是同一个学生。当我们认为判定equals的相等应该是逻辑上的相等而不是只判断是不是内存中的同一个东西的时候,我们就应该重写equals()。而涉及到HashMap的时候,重写了equals()就要重写hashCode()。
总结:
- 同一个对象(没有发生过修改)无论何时调用hashCode(),得到的返回值必须一样。
- hashCode()返回值相等,对象不一定相等,通过hashCode()和equals()必须能唯一确定一个对象。
- 一旦重写了equals(),就必须重写hashCode()。而且hashCode()生成哈希值的依据应该是equals()中用来比较是否相等的字段。如果两个由equals()规定相等的对象生成的hashCode不等,对于HashMap来说,他们可能分别映射到不同位置,没有调用equals()比较是否相等的机会,两个实际上相等的对象可能被插入到不同位置,出现错误。其他一些基于哈希方法的集合类可能也会有这个问题。