一、Set系列集合概述
1、Set系列集合特点
- 无序:存储顺序不一致
- 不重复:可以去除重复
- 无索引:没有带索引的方法,所以不能使用普通for循环遍历,也不能通过索引来获取元素。
2、Set集合实现类特点
- HashSet:无序、不重复、无索引。
- LinkedHashSet:有序、不重复、无索引。
- TreeSet:排序、不重复、无索引。
Set集合的功能上基本与Collection的API一致。
二、Set集合去重复
1、创建一个存储学生对象,存储多个学生对象,使用程序实现在控制台遍历集合,要求:学生对象的成员变量值相同,我们就认为是同一个对象。
2、分析
- 定义学生类,创建HashSet集合对象,创建学生对象
- 把学生添加到集合
- 在学生类中重写两个方法,hashCode()和equals(),自动生成即可
- 遍历集合(增强for)
示例代码如下:
Set<Student> sets = new HashSet<>();
Student s1 = new Student("a",20,'男');
Student s2 = new Student("a",20,'男');
Student s3 = new Student("b",21,'男');
sets.add(s1);
sets.add(s2);
sets.add(s3);
System.out.println(sets);
不重写时,其结果如下:
进行重写方法:
@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 && sex == student.sex && Objects.equals(name, student.name);
}
@Override
public int hashCode() {
return Objects.hash(name, age, sex);
}
最终的hashCode值和最终结果为:
三、LinkedHashSet集合概述和特点
- 有序、不重复、无索引
- 这里的有序指的是保证存储和取出的元素顺序一致
- 原理:底层数据结构依然是哈希表,只是每个元素又额外多了一个双链表的机制记录存储的顺序。
四、TreeSet
1、TreeSet集合概述和特点
- 不重复、无索引、可排序
- 可排序:按照元素的大小默认升序(由小到大)排序。
- TreeSet集合底层是基于红黑树的数据结构实现排序的,增删改查性能都较好。
- 注意:TreeSet集合是一定要排序的,可以将元素按照指定的规则进行排序。
2、TreeSet集合默认的规则
- 对于数值类型:Integer,Double,官方默认按照大小进行升序排序
- 对于字符串类型:默认按照首字符编号的升序排序
- 对于自定义类型如Student对象,TreeSet无法直接排序(想要用TreeSet存储自定义类型,需要制定排序规则)
3、自定义排序规则
- 让自定义的类实现Comparable接口重写里面的compareTo方法来制定比较规则。
public class Student implements Comparable<Student>{
private String name;
private int age;
private char sex;
@Override
public int compareTo(Student o) {
//按照年龄进行比较
return this.age - o.age;
}
- TreeSet集合含有参数构造器,可以设置Comparator接口对应的比较器对象,来制定比较规则。
//集合自带比较器对象进行规则定制
Set<Student> sets = new TreeSet<>(new Comparator<Student>() {
@Override
public int compare(Student o1, Student o2) {
return o1.getAge() - o2.getAge();
//浮点型建议直接使用Double.compare进行比较
}
});
注意:如果TreeSet集合存储的对象有实现比较规则,集合也自带比较器,默认使用集合自带的比较器排序。