一、引言
Java中的Set集合是一种常用的数据结构,它类似于数学中的集合概念,可以存储不重复的元素。Set集合提供了高效的查找、插入和删除操作,能够帮助我们轻松地管理数据,并且在处理数据时具有很好的性能表现。在Java编程中,Set集合的独特特性使得它成为处理唯一性数据的重要工具之一。
二、Collection集合
- 是List和Set的父接口
- 所有集合都是由Collection或者Map派生
特点
- 内部存放List和Set的共性方法
- 没有直接实现类
三、Set的存储特点
无序,无下标,元素不可重复
四、Set的常用实现类
-
HashSet
- JDK1.2 底层哈希表(数组+链表)实现 线程不安全,效率高
-
LinkedHashSet
- JDK1.2 使HashSet的子类,底层哈希表实现 线程不安全,效率高
-
TreeSet(实现的是Set集合的子接口SortedSet,TreeSet里面的排序方法全来自于它)
- JDK1.2 底层红黑树实现,是SortedSet的实现类 线程不安全,效率高
红黑树:树状结构存放数据,使用的是二分查找法,特点为查询效率快
五、创建
- 建议使用多态
Set<泛型> 集合名=new 实现类名<>();
六、常用方法
- 所有方法都继承自Collection,无独有方法
七、遍历
- 迭代器遍历
- 外遍历forEach
- 自遍历forEach
八、哈希表的去重原理
- 先调用元素的hashCode方法获取哈希码值
- 通过哈希码值%数组长度(16)得到存放下标
- 如果下标位置未存有元素,则直接存放
- 如果下标位置存有元素, 则调用当前元素的equals方法与下标位置元素进行值的比较
- 都不相同, 在下标位置上继续链表存放
- 有相同,则舍弃添加当前元素
九、使用
-
HashSet和LinkedHashSet如果存放的是自定义类型,则必须重写hashCode和equals方法才能实现去重
-
LinkedHashSet可以保证元素存入与取出的顺序一致
-
TreeSet可以实现对元素进行默认的升序排序
-
如果TreeSet中存放的是自定义类型,则必须自定义排序规则
-
排序方式:
-
实现Comparable接口,重写CompareTo方法
-
思路:让当前对象this和参数对象o进行比较
-
实现:对谁排序,就让谁实现
-
规则:
-
从小到大:
this的值>o的值,返回正数
this的值<o的值,返回负数
-
从大到小:
this的值>o的值,返回负数
this的值<o的值,返回正数
相等返回0
-
package com.by.entity; public class Student implements Comparable<Student>{ private String name; private int age; private double score; //省略getter、setter、构造 @Override public int compareTo(Student o) { //根据学生成绩从高到底排序 if (this.score > o.score) { return -1; } else if (this.score < o.score) { return 1; } return 0; } }
-
-
实现Comparator接口,重写compare方法
- 思路: 让参数o1和o2进行比较
- 实现:在集合创建处的小括号内传入实现类对象
Set<Student> set = new TreeSet<>((o1,o2)->{ //根据学生成绩从低到高 if (o1.getScore() > o2.getScore()) { return 1; } else if (o1.getScore() < o2.getScore()) { return -1; } return 0; });
- 默认识别Comparable,但是Comparator优先级更高
- Comparator更能保护类的单一职责,有利于后期代码的维护, 集合排序扩展性更高,更推荐该方式
-
-
-
TreeSet去重规则:当compareTo或compare方 法返回值为0时去重
十、结语
Set集合作为Java编程中常用的数据结构之一,在实际编程中具有广泛的应用,我们要熟悉掌握它,只不过Set集合使用场景没有List集合多。