public class HashSetDemo {
public static void main(String[] args) {
HashSet<Student> hs = new HashSet<>();
Student s1 = new Student("zhangsan",11);
Student s2 = new Student("lisi",13);
Student s3 = new Student("zhangsan",11);
hs.add(s1);
hs.add(s2);
hs.add(s3);
for (Student s: hs){
System.out.println(s);
}
}
}
class Student{
String name;
int age;
public Student(String name, int age){
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Student [name=" + name + ", age=" + age + "]";
}
}
因为HashSet的add()方法,首先会使用当前集合中的每一个元素和添加的元素进行hash值比较,如果hash值不一样,则直接添加新的元素;
如果hash值一样,比较地址值或者使用equals方法进行比较;
比较结果一样时,则认为是重复元素不添加,当要添加的元素与集合中所有的元素比较结果都不一样时,则添加元素。
重写hashCode方法和equals方法实现HashSet存储自定义对象去重
public class HashSetDemo {
public static void main(String[] args) {
HashSet<Student> hs = new HashSet<>();
Student s1 = new Student("zhangsan",11);
Student s2 = new Student("lisi",13);
Student s3 = new Student("zhangsan",11);
hs.add(s1);
hs.add(s2);
hs.add(s3);
for (Student s: hs){
System.out.println(s);
}
}
}
class Student{
String name;
int age;
public Student(String name, int age){
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Student [name=" + name + ", age=" + age + "]";
}
@Override
public int hashCode() {
return 1;
}
@Override
public boolean equals(Object obj) {
Student s = (Student)obj;
if(this.age != s.age)
return false;
if(!this.name.equals(s.name))
return false;
return true;
}
}