- 首先,来看HashSet集合添加一个元素的过程:
-
调用对象的hashCode()方法获取对象的哈希值
-
根据对象的哈希值计算对象的存储位置
-
判断该位置是否有元素,如果没有元素则将元素存储到该位置;如果有元素则遍历该位置的所以元素,和新存入的元素比较哈希值是否相同,如果都不相同则将元素存储到该位置;如果有相同的,则调用equals()方法比较对象内容是否相等。
-
如果返回false则将元素存储到该位置,如果返回true则说明元素重复,不存储。
其流程图:
HashSet集合存储元素:要保证元素唯一性,需要重写hashCode()和equals()方法。
import java.util.HashSet;
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;
}
/*
重写hashCode()和equals()方法
*/
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Student student = (Student) o;
if (age != student.age) return false;
return name != null ? name.equals(student.name) : student.name == null;
}
@Override
public int hashCode() {
int result = name != null ? name.hashCode() : 0;
result = 31 * result + age;
return result;
}
}
public class HashSetDemo01 {
public static void main(String[] args) {
//创建HashSet集合对象
HashSet<Student> hs = new HashSet<Student>();
//床架学生对象
Student s1 = new Student("张彤彤",23);
Student s2 = new Student("李珊珊",22);
Student s3 = new Student("谢婷婷",21);
Student s4 = new Student("谢婷婷",21);
//把学生添加到集合
hs.add(s1);
hs.add(s2);
hs.add(s3);
hs.add(s4);
//用增强for遍历集合
for (Student s:hs){
System.out.println(s.getName()+","+s.getAge());
}
//如果Student类中不重写hashCode()和equals()方法,就不能保证所存储的元素的一致性
}
}
结果:如果不重写hashCode()和equals()方法,则无法保证数据元素唯一性,会出现两个谢婷婷,21。重写hashCode()和equals()方法,那么就不会出现重复元素。
D:\Users\Java\jdk1.8.0_102\bin\java.exe…
谢婷婷,21
张彤彤,23
李珊珊,22