java的equals和hashCode

初学者经常看到网上有博文推荐重写实体的equals和hashCode方法,而却hashCode的生成的关联属性和equals比较的属性要一直,但是不知道为什么要这样,现在用实例来说明为什么要一致

程序员:do not talk,show me the code

  • 实体类:
public class Person  {
    private int age;
    private String name;

    public Person() {
    }

    public Person(int age) {
        this.age = age;
    }

    public Person(int age, String name) {
        this.age = age;
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getName() {
        return name;
    }

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

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Person person = (Person) o;
        if (age != person.age) return false;
        return name != null ? name.equals(person.name) : person.name == null;

    }

    @Override
    public int hashCode() {
        return Objects.hashCode(age, name);
    }

    @Override
    public String toString() {
        return age+name;
    }
}
  • 测试代码:
Set<Person> persons = Sets.newHashSet();
Person person1 = new Person(1, "randy");
Person person2 = new Person(2, "randy");
Person person3 = new Person(2, "jack");
persons.add(person1);
persons.add(person2);
persons.add(person3);
System.out.println(person1.equals(person2));
System.out.println(person2.equals(person3));
System.out.println(persons.size());
  • 输出结果:
true
false
3
  • 可以将hashCode方法改成只对age进行hashCode,结果也一样

分析:

  • 从程序的执行结果来看,person1和person2是equals的,但为什么set会存3个呢?
  • 这就要从HashSet的机制来说了,HashSet在两个对象equals并且hashCode相等时,才认为两个对象重复,不然就当做不同的对象来add,所以尽管person1和person2是equals的,但实际上HashSet当做两个非重复对象进行add存储了
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值