equals方法与hashcode方法

时间:2021-04-07 16:05:20

//当我们想要进行对象(自己新建的)之间的比较的时候我们需要重写对象的equals方法和hashcode方法 若a.equals(b)==true 则a.hashcode()==b.hashcode一定成立,反之不成立!!!
public class Person
{
    private String id;
    private String name;
    //重写equals方法分为4个部分
    public boolean equals(Object obj)
    {

  //1:先判断obj是否为空
        if (obj == null)
        {
            return false;
        }

  //2 再判断obj是否==内部对象
        if (obj == this)
        {
            return true;
        }

  //判断类型是否一样
        if (obj.getClass() != this.getClass())
        {
            return false;
        }

  //类中的所有的属性都要进行比较
        Person p = (Person) obj;
        return this.getId().equals(p.getId())
                && this.getName().equals(p.getName());
    }

    public String getId()
    {
        return id;
    }

    public String getName()
    {
        return name;
    }

    @Override
    public int hashCode()
    {

  //20是随机取的 还可以取17 50等
        int result = 20;
        result = result * 31 + this.name.hashCode();
        result = result * 31 + this.id.hashCode();
        return result;
    }

    public void setId(String id)
    {
        this.id = id;
    }

    public void setName(String name)
    {
        this.name = name;
    }

    @Override
    public String toString()
    {
        return "Person [id=" + id + ", name=" + name + "]";
    }
}

//测试类

public class Test
{
    public static void main(String[] args)
    {
        Person p1 = new Person();
        Person p2 = new Person();
        p1.setId("11");
        p1.setName("wangChao");
        p2.setId("11");
        p2.setName("wangChao");
        // 测试重写的equals方法
        System.out.println(p1.equals(p2));
        Set<Person> s = new HashSet<Person>();
        s.add(p1);
        s.add(p2);
        // 测试重写的hashcode方法
        System.out.println(s);
    }
}