java 虐“狗”日常

112 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第27天,点击查看活动详情

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