Set系列集合

45 阅读1分钟

一、Set系列集合概述

1、Set系列集合特点

  • 无序:存储顺序不一致
  • 不重复:可以去除重复
  • 无索引:没有带索引的方法,所以不能使用普通for循环遍历,也不能通过索引来获取元素。

2、Set集合实现类特点

  • HashSet:无序、不重复、无索引。
  • LinkedHashSet:有序、不重复、无索引。
  • TreeSet:排序、不重复、无索引。

Set集合的功能上基本与Collection的API一致。

二、Set集合去重复

1、创建一个存储学生对象,存储多个学生对象,使用程序实现在控制台遍历集合,要求:学生对象的成员变量值相同,我们就认为是同一个对象。

2、分析

  1. 定义学生类,创建HashSet集合对象,创建学生对象
  2. 把学生添加到集合
  3. 在学生类中重写两个方法,hashCode()和equals(),自动生成即可
  4. 遍历集合(增强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);

不重写时,其结果如下:

image.png 进行重写方法:

@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值和最终结果为:

image.png

三、LinkedHashSet集合概述和特点

  1. 有序、不重复、无索引
  2. 这里的有序指的是保证存储和取出的元素顺序一致
  3. 原理:底层数据结构依然是哈希表,只是每个元素又额外多了一个双链表的机制记录存储的顺序。

四、TreeSet

1、TreeSet集合概述和特点

  1. 不重复、无索引、可排序
  2. 可排序:按照元素的大小默认升序(由小到大)排序。
  3. TreeSet集合底层是基于红黑树的数据结构实现排序的,增删改查性能都较好。
  4. 注意:TreeSet集合是一定要排序的,可以将元素按照指定的规则进行排序。

2、TreeSet集合默认的规则

  • 对于数值类型:Integer,Double,官方默认按照大小进行升序排序
  • 对于字符串类型:默认按照首字符编号的升序排序
  • 对于自定义类型如Student对象,TreeSet无法直接排序(想要用TreeSet存储自定义类型,需要制定排序规则)

3、自定义排序规则

  1. 让自定义的类实现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;
}
  1. 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集合存储的对象有实现比较规则,集合也自带比较器,默认使用集合自带的比较器排序。