微信搜索《Java鱼仔》,每天一个知识点不错过
(一)每天一个知识点
两个对象的 hashCode()相同,则 equals()也一定为 true吗?
(二)结论
这是一道很常见并且很简单的面试题,这道题的结论:
两个对象的hashCode()相同,equals()不一定为true;
两个对象的equals为true,则两个对象的hashcode一定为true;
(三)再多学一点
首先我们来了解一下hashCode()方法是干什么的,hashCode的存在主要是用于查找的快捷,比如我们常用的HashMap等集合,hashCode用来在散列的存储结构中确定对象的存储地址。
java中所有的对象都有一个父类Object,而Object有一个hashCode方法,Java的所有类都有hashcode方法。
我们来看看hashcode的计算方法:
for (Objectelement : a) result=31*result+ (element==null?0 : element.hashCode());
hashcode其实就是对一个对象中的每个元素进行一次运算生成的结果值,两个不同的对象是有可能出现同一个hash值的。
比如下面两个字符串:
Strings1="Ma"; Strings2="NB"; System.out.println(s1.hashCode()==s2.hashCode()); //trueSystem.out.println(s1.equals(s2)); //false
虽然两个Ma和NB两个字符串不同,但是他们有相同的hashcode值2484。
创建实体类的时候如果要使用hashCode方法或equals方法时需要在实体类中重写:
publicbooleanequals(Objecto) { if (this==o) returntrue; if (o==null||getClass() !=o.getClass()) returnfalse; Useruser= (User) o; returnObjects.equals(name, user.name) &&Objects.equals(age, user.age); } publicinthashCode() { returnObjects.hash(name, age); }
同理,实体对象同样存在两个不同对象存在同一个hash值的情况。