两个对象的 hashCode() 相同,则 equals() 也一定为 true 吗?
- 两个对象的hashCode()相同,equals()不一定为true;
- 两个对象的equals为true,则两个对象的hashcode一定为true;
案例:
@Test
public void hashDemo() {
string str1 = "Ma";
String str2 = "NB";
System.out.println("hash1: " + str1.hashCode());
System.out.println("hash2: " + str2.hashCode());
System.out.println(str1.equals(str2));
}
原因:我们看下hashcode的计算方法:hashcode其实就是对一个对象中的每个元素进行一次运算生成的结果值,两个不同的对象是有可能出现同一个hash值的。
public int hashCode() {
int h = hash;
if (h == 0 && value.length > 0) {
char val[] = value;
for (int i = 0; i < value.length; i++) {
h = 31 * h + val[i];
}
hash = h;
}
return h;
}
虽然两个Ma和NB两个字符串不同,但是他们有相同的hashcode值2484。
所以在创建实体类的时候如果要使用hashCode方法或equals方法时需要在实体类中重写,以User类为例:
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
User user = (User) o;
return id == user.id && Objects.equals(username, user.username) && Objects.equals(email, user.email);
}
@Override
public int hashCode() {
return Objects.hash(id, username, email);
}