首先是student类的创建:
public class Student {
private String name;
private int age;
public Student(String name, int age) {
this.name = name;
this.age = age;
}
public Student(){}
public String getName() { return name; }
public void setName(String name) { this.name = name; }
public int getAge() { return age; }
public void setAge(int age) { this.age = age; }
}
先测试一下hashset的去重效果:
Set<Student> set = new HashSet<>();
set.add(new Student("刘备",27));
set.add(new Student("关羽",23));
set.add(new Student("张飞",20));
set.add(new Student("张飞",20));
for (Student student : set) {
System.out.println(student.getName() + "==" + student.getAge());
}
结果如下:
张飞==20
刘备==27
关羽==23
张飞==20
测试失败,是因为没有重写student类的hashcode和equals
重写student类后如下:
public class Student {
private String name;
private int age;
public Student(String name, int age) {
this.name = name;
this.age = age;
}
public Student(){}
public String getName() { return name; }
public void setName(String name) { this.name = name; }
public int getAge() { return age; }
public void setAge(int age) { this.age = age; }
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Student student = (Student) o;
return age == student.age &&
Objects.equals(name, student.name);
}
@Override
public int hashCode() {
return Objects.hash(name, age);
}
}
同样的代码再次测试:
Set<Student> set = new HashSet<>();
set.add(new Student("刘备",27));
set.add(new Student("关羽",23));
set.add(new Student("张飞",20));
set.add(new Student("张飞",20));
for (Student student : set) {
System.out.println(student.getName() + "==" + student.getAge());
}
结果如下:
张飞==20
刘备==27
关羽==23
测试成功!