当前位置: 首页 > 图灵资讯 > java面试题> 金三银四精选java面试题-两个对象的 hashCode() 相同,则 equals() 也一定为 true 吗?

金三银四精选java面试题-两个对象的 hashCode() 相同,则 equals() 也一定为 true 吗?

来源:图灵教育
时间:2023-11-27 10:26:21
 

两个对象的 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);
}