双十一马上来了作为单身程序员的你,你是打算过购物节呢,还是过光棍节呢?扎心了吧老铁,然而我再告诉你一个更加悲催的事情:你所用的 Java 中存在一对青梅竹马的对象 equals 先生 和 hashCode 女士。下面我就给你们讲讲它俩之间的故事。
一、讲故事
equals 先生 equals 先生工作在一家名叫 EqualsCompany 的公司,他每天的工作就识别进来的员工是否打卡了两次。
public class EqualsCompany
{
private String para;
//公司大门
public EqualCompany(string p)
{
this.para=p;
}
//equals 先生的工位
public boolean equals(Object o)
{
if(!(0 instanceof EqualsCompany))
{
return false;
}
EqualsCompany ec=(EqualsCompany)0;
return ec.para.equals(para);
}
}
复制代码
一天工作检查组来到了 EqualsCompany 公司来检查员工的工作成果。
public class Test
{
public static void main(String[] args)
{
Set<EqualsCompany> ec=new HashSet<>();
//检查组的两个检查人员
ec.add(new EqualsCompany("tom"));
//执行检查
System.out.println(ec.contains(new EqualsCompany("tom")));
}
}
复制代码
检查组做完检查后发现 equals 先生根本无法识别出哪些员工打卡了两次。
hashCode 女士 hashCode 女士和 equals 先生位于同一家公司并且做着同样的工作,只不过 equals 先生是晚班 hashCode 女士是早班。
public class EqualsCompany
{
private String para;
//公司大门
public EqualCompany(string p)
{
this.para=p;
}
//hashCode 女士的工位
public int hashCode()
{
return 32*para.hashCode();
}
}
复制代码
同样,检查组检查了 hashCode 女士的工作后发现她也不能正确识别出哪个员工打卡了两次。为了解决这个问题 EqualsCompany 公司召开了内部会议。通过讨论发现只要 equals 先生 和 hashCode 女士在一起工作就能准确的识别出哪个员工打卡了两次。
public class EqualsCompany
{
private String para;
//公司大门
public EqualCompany(string p)
{
this.para=p;
}
//equals 先生的工位
public boolean equals(Object o)
{
if(!(0 instanceof EqualsCompany))
{
return false;
}
EqualsCompany ec=(EqualsCompany)0;
return ec.para.equals(para);
}
//hashCode 女士的工位
public int hashCode()
{
return 32*para.hashCode();
}
}
复制代码
经过工作重新调整,识别打卡两次的员工非常准确,两人的感情也越来越升温,最终走在了一起。
二、总结
上一小节所描述的问题其实是个开发规范问题,hashCode 要求相等的对象必须具备相同的散列码,因此我们只要在重写了 equals 方法后就必须重写 hashCode 方法。
评论