一、HashSet集合存储元素不重复的原理
前提:存储的元素必须重写hashCode方法和equals方法
二、HashSet存储自定义类型元素
1. 创建自定义类型Student类
package cn.GTMStudio.collection;
public class Student {
private String name;
private int age;
public Student() {
}
public Student(String name, int age) {
this.name = name;
this.age = age;
}
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 String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
2. 编写测试类
package cn.GTMStudio.collection;
import java.util.HashSet;
public class HashSetDemo01 {
public static void main(String[] args) {
HashSet<Student> stuSet=new HashSet<>();
Student s1=new Student("henrly",18);
Student s2 = new Student("henrly", 18);
Student s3 = new Student("jerry", 16);
stuSet.add(s1);
stuSet.add(s2);
stuSet.add(s3);
System.out.println(stuSet);
}
}
运行结果如下
发现存储了相同的元素,这不符合HashSet不能存储重复元素的性质,这是因为Student类没有重写hashCode()和equals()方法
3. 重写hashCode()和equals()方法
package cn.GTMStudio.collection;
import java.util.Objects;
public class Student {
private String name;
private int age;
public Student() {
}
public Student(String name, int age) {
this.name = name;
this.age = age;
}
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);
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
再次查看hashCode和equals
4. 重新运行测试类
总结
使用HashSet存储自定义类型元素时,要发挥出HashSet存储元素不重复的特性的前提:必须重写自定义类型的hashCode()和equals()方法。