HashSet 存储的数据是无序,不重复的,原因是因为每个字符有其对应的 hashCode 值。然而,我们在 HashSet 集合中存储自定义对象时,每 new 出来一个对象在我们的 Java 内存中是不同的,但是 HashSet 集合存储的是不重复的,为了解决这个矛盾,我们需要重写 hashCode 和 equals 方法进行判断是否存在相同的数据存在。
自定义 Person 类:
public class Person {
private String name;
private Integer age;
/**
* 重写hashCode方法
* */
public int hashCode(){
return name.hashCode() + age*2;
}
/**
* 重写 equals方法
* */
public boolean equals(Object obj){
if( this == obj){
return true;
}
if( obj == null){
return false;
}
if(obj instanceof Person){
Person p = (Person)obj;
return name.equals(p.name) && age==p.age;
}
return false;
}
public Person() {
super();
}
public Person(String name, Integer age) {
super();
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
@Override
public String toString() {
return name + "....." + age;
}
测试类:
public static void main(String[] args) {
HashSet<Person> hashPersons = new HashSet<Person>();
hashPersons.add(new Person("a",10));
hashPersons.add(new Person("a",10));
hashPersons.add(new Person("abc",10));
hashPersons.add(new Person("abc",11));
System.out.println(hashPersons);
}
如果不重写 hashCode 和 equals 方法,会有相同的 name = "a",age = 10 打印出来;重写之后,我们就把重复的数据进行筛选了出来。