双十一马上来了作为单身程序员的你,你是打算过购物节呢,还是过光棍节呢?扎心了吧老铁,然而我再告诉你一个更加悲催的事情:你所用的 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 方法。
评论