只要覆盖equals()方法,就应该覆盖hasCode()方法
它不需要被覆盖.....
覆盖hashcode类主要用在set set中...
在集合中,为了保证集合元素的一致性,集合中没有重复的元素。插入时,equals()方法将用于根据内存地址比较对象是否相等。当你的equals()方法没有被覆盖时,就断定两个对象的地址都是真的,它们的哈希码一定是一样的。
当您重写equals()方法时,您比较的equals()的结果可能是真的,但是由于两个对象在内存中的存储地址不同,它们的哈希代码可能不同。在这种情况下,hashset将无法正常工作,所以为了保证HashSet的正常运行,此时,应该同时覆盖HashCode()方法.....
Examda提示:Object类中定义了hashCode()和equals()方法,Object类的equals()方法根据内存地址比较对象是否相等,所以如果object1.equals(object2)为true,说明object1变量和object2变量实际上引用的是同一个对象,所以Object1和object2的hash代码必须相同, 这意味着Object1 . hashcode()= = Object2 . hashCode()
如果用户定义的类覆盖了Object类的equals()方法,但是,如果Object类的hashCode()方法没有被覆盖,当object1.equals(object2)为true时,Object 1和Object 2的哈希代码可能不相同。
所以如果重写equals()方法,也应该重写hashCode()方法,并确保两个equal object对象的哈希代码是相同的
代码:
objectChild重写Object类的equals()方法
public boolean equals(objecto){
。
如果(!(o instanceof ObjectChild))返回false
final object child other =(object child)o;
if(this . name . equals(other . getname())& & this . age = = other . getage())
/这里假设的ObjectChild是一个JavaBean对象,包含name和age两个属性。如果姓名和年龄相同,则视为同一对象[/
else
返回false
}
ObjectChild重写Object类的hashCode()方法
/Examda提示:返回自定义方法计算的hashCode值,使属性相同的对象具有相同的hashCode;
public int hashCode(){
int result;
result = (name==null?0:name . hashcode());
result = 29 * result+(age = = null?0:age . hashcode());
返回结果;
}
0条评论