初学者经常看到网上有博文推荐重写实体的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存储了