HashSet:
类似哈希表的集合类型,底层数据结构为哈希表,集成了数组和链表的特性;JDK1.8之后加入了二叉树;HashSet元素唯一且无序,其唯一性是由重写HashCode()方法和equals()方法来保持的;
HashSet集合底层使用 HashMap集合存储的,重写HashCode方法主要是为了减少碰撞,即减少了调用equals方法;
举例如下:
//测试类:
import java.util.HashSet;
public class Test {
public static void main(String[] args) {
HashSet<Student> hashSet = new HashSet<>();
hashSet.add(new Student("zhangsan", 19));
hashSet.add(new Student("zhangsan", 19));
hashSet.add(new Student("lisi", 20));
hashSet.add(new Student("wangwu", 22));
for (Student student : hashSet) {
System.out.println(student);
}
}
}
//Student类:
import java.util.Objects;
class Student {
private String name;
private int age;
public Student(){}
public Student(String name, int age){
this.name = name;
this.age = age;
}
public void show () {
System.out.println(name +"..."+age);
}
public String getName(){
return name;
}
public int getAge(){
return age;
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
//通过重写equals()和hashCode()方法来保证元素唯一;
@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);
}
}