您的位置:首页 > 其它

equals和hashCode没有必然的联系

2015-09-09 09:15 344 查看
由于equals()和hashCode()方法都是Object中的,所以hashCode和equals方法都可以被重写的,如果重写了其中的一个,而没有重写另外一个,则两个对象A,B之间如果A.equals(B)==true ,那么A的hashCode和B的hashCode未必相等。



package com.jjyy.basic;

public class EqualsDemo {

public static void main(String[] args) {
EqualsTest cat = new EqualsTest("zhansan", 20);
EqualsTest dog = new EqualsTest("zhansan", 23);
System.out.println(cat.equals(dog));
System.out.println(cat.hashCode() == dog.hashCode());
}
}

class EqualsTest {

private String name;

private int age;

public EqualsTest(String name, int age) {
super();
this.name = name;
this.age = age;
}

@Override
public boolean equals(Object obj) {
// 只要name相同也可能相同
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
EqualsTest other = (EqualsTest) obj;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
return true;
}

}
结果为:

true
false


如果重写了hashCode和equals方法,那么两者就都相等了

package com.jjyy.basic;

public class EqualsDemo {

public static void main(String[] args) {
EqualsTest cat = new EqualsTest("zhansan", 20);
EqualsTest dog = new EqualsTest("zhansan", 23);
System.out.println(cat.equals(dog));
System.out.println(cat.hashCode() == dog.hashCode());
}
}

class EqualsTest {

private String name;

private int age;

public EqualsTest(String name, int age) {
super();
this.name = name;
this.age = age;
}

@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((name == null) ? 0 : name.hashCode());
return result;
}

@Override
public boolean equals(Object obj) {
// 只要name相同也可能相同
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
EqualsTest other = (EqualsTest) obj;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
return true;
}

}
结果为:

true
true


所以,在重写了equals方法时,建议最好将hashCode方法也重写了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: