写点什么

java 虐“狗”日常

用户头像
喵叔
关注
发布于: 1 小时前

双十一马上来了作为单身程序员的你,你是打算过购物节呢,还是过光棍节呢?扎心了吧老铁,然而我再告诉你一个更加悲催的事情:你所用的 Java 中存在一对青梅竹马的对象 equals 先生 和 hashCode 女士。下面我就给你们讲讲它俩之间的故事。


一、讲故事

  1. 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 先生根本无法识别出哪些员工打卡了两次。


  1. 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 方法。

发布于: 1 小时前阅读数: 2
用户头像

喵叔

关注

还未添加个人签名 2020.01.14 加入

还未添加个人简介

评论

发布
暂无评论
java 虐“狗”日常