微信搜索《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值的情况。