每天一个知识点(五)两个对象的 hashCode()相同,则 equals()也一定为 true吗?

593 阅读1分钟

微信搜索《Java鱼仔》,每天一个知识点不错过

(一)每天一个知识点

两个对象的 hashCode()相同,则 equals()也一定为 true吗?

(二)结论

这是一道很常见并且很简单的面试题,这道题的结论:

两个对象的hashCode()相同,equals()不一定为true;

两个对象的equals为true,则两个对象的hashcode一定为true;

(三)再多学一点

首先我们来了解一下hashCode()方法是干什么的,hashCode的存在主要是用于查找的快捷,比如我们常用的HashMap等集合,hashCode用来在散列的存储结构中确定对象的存储地址。

java中所有的对象都有一个父类Object,而Object有一个hashCode方法,Java的所有类都有hashcode方法。

我们来看看hashcode的计算方法:

for (Object element : a)
    result = 31 * result + (element == null ? 0 : element.hashCode());

hashcode其实就是对一个对象中的每个元素进行一次运算生成的结果值,两个不同的对象是有可能出现同一个hash值的。

比如下面两个字符串:

String s1="Ma";
String s2="NB";
System.out.println(s1.hashCode()==s2.hashCode());  //true
System.out.println(s1.equals(s2));  //false

虽然两个Ma和NB两个字符串不同,但是他们有相同的hashcode值2484。

创建实体类的时候如果要使用hashCode方法或equals方法时需要在实体类中重写:

@Override
public boolean equals(Object o) {
    if (this == o) return true;
    if (o == null || getClass() != o.getClass()) return false;
    User user = (User) o;
    return Objects.equals(name, user.name) &&
            Objects.equals(age, user.age);
}

@Override
public int hashCode() {
    return Objects.hash(name, age);
}

同理,实体对象同样存在两个不同对象存在同一个hash值的情况。