hashmap 保存自定义类需要重写的方法

重写 hashcode 与 equals 方法

HashMap 中 put 数据时,首先判断 hashcode 是否相等,再判断 key 是否 equals

HashMap 中,如果要比较 key 是否相等,要同时使用这两个函数。因为自定义类的 hashcode() 方法继承于 object 类,其 hashcode 码为内存地址,这样即便有相同含义的两个对象,比较也是不相等的,例如,生成了两个 “羊” 对象,正常理解这两个对象应该是相等的,但如果不重写 hashcode() 方法的话,比较是不相等的。

object 版本的 equals 只是简单的判断是不是同一个实例。但是有时候我们想要的只是逻辑上的相等,比如有一个学生类 student,有一个属性 studentID,只要 studentID 相等,不是同一个实例我们也认为是同一个学生。当我们认为判定 equals 的相等是逻辑上的相等而不只是内存地址的相同时,就需要重写 equals()。而涉及到 HashMap 的时候,重写了 equals() 就需要重写 hashcode() 。如果你重写了 equals,而 hashcode 没有变,那么很可能某两个对象明明是 “相等” 的,但 hashcode 却不一样。

这样,当你使用其中一个作为键保存到 HashMap、HashTable或 HashSet 中,再以 “相等” 的另一个作为键值去查找他们的时候,则根本找不到。(因为 hashcode 不同,而散列表根据 hashcode 来定位,所以不会定位到同一个位置上)

hashMap 中比较 key 的过程是这样的,首先求出 key 的 hashcode,比较其值是否相等,若相等再比较 equals(),equals() 返回 true 则认为两个 key 是相等的。如果只重写 hashcode() 不重写 equals(),当比较 equals 时只是判断二至是否为同一对象,所以必定要两个方法一起重写。

-----------本文结束感谢您的阅读-----------
0%