TreeSet() 是使用二叉树的原理对新 add() 的对象按照指定的顺序排序(升序、降序),每增加一个对象都会进行排序,将对象插入的二叉树指定的位置; ~ 本篇内容包括:TreeSet 概述、TreeSet 的使用以及其他知识点
文章目录- 一、TreeSet 概述
- 二、TreeSet 的使用
- 1、构造方法
- 2、常用方法
- 1、构造方法
- 2、常用方法
- 三、其他知识点
- 1、关于 HashSet、LinkedHashSet 和 TreeSet 的区别
- 2、关于 红黑树的特点
- 3、关于 TreeSet 和 TreeMap 的区别
一、TreeSet 概述
TreeSet() 是使用二叉树的原理对新 add() 的对象按照指定的顺序排序(升序、降序),每增加一个对象都会进行排序,将对象插入的二叉树指定的位置;
Integer 和 String 对象都可以进行默认的 TreeSet 排序,而自定义类的对象是不可以的,自己定义的类必须实现 Comparable 接口,并且覆写相应的 compareTo()
函数,才可以正常使用;在覆写 compare()
函数时,要返回相应的值才能使 TreeSet 按照一定的规则来排序
比较此对象与指定对象的顺序。如果该对象小于、等于或大于指定对象,则分别返回负整数、零或正整数
TreeSet 的作用是保存无重复的数据,不过还对这些数据进行了排序。TreeMap 的底层是通过红黑树实现的,所以 TreeSet 底层也是通过红黑树实现的。TreeSet 最主要的特点就是对元素进行了排序。其特点如下:
- TreeSet 是基于 TreeMap 的 NavigableSet 实现;
- TreeSet 的元素存储在 TreeMap 中的 key 中,TreeMap 的 value 是一个常量对象;
- 非线程安全;
- java8 新增分割器
spliterator()
方法
二、TreeSet 的使用
1、构造方法
方法名 | 方法说明 | 方法名 | 方法说明 |
---|---|---|---|
public TreeSet() | 无参构造方法,完成 map 的创建; | public TreeSet(Comparator<? super E> comparator) | 构造TreeSet,根据指定的比较器进行排序 |
public TreeSet(Collection<? extends E> c) | 构造一个包含指定集合中的元素的TreeSet,根据其元素的自然排序进行比较 | public TreeSet(SortedSet<E> s) | 构造TreeSet,并使用与指定排序集相同的顺序 |
2、常用方法
方法名 | 方法说明 | 方法名 | 方法说明 |
---|---|---|---|
boolean add(E e) | 添加一个元素,如果该元素已经存在,则返回true,如果不存在,则返回false | boolean addAll(Collection<? extends E> c) | 添加一个包含指定元素的集合 |
boolean remove(Object o) | hashSet的迭代器 | void clear() | 获得大小 |
NavigableSet<E> headSet(E toElement, boolean inclusive) | 返回子 Set | NavigableSet<E> tailSet(E fromElement, boolean inclusive) | 返回Set的尾部,范围是:从fromElement到结尾。 |
E first() | 返回Set的第一个元素 | E last() | 返回Set的最后一个元素 |
E lower(E e) | 返回Set中小于e的最大元素 | E floor(E e) | 返回Set中小于/等于e的最大元素 |
E ceiling(E e) | 返回Set中大于/等于e的最小元素 | E higher(E e) | 返回Set中大于e的最小元素 |
E pollFirst() | 获取第一个元素,并将该元素从TreeMap中删除 | E pollLast() | 获取最后一个元素,并将该元素从TreeMap中删除 |
void writeObject(java.io.ObjectOutputStream s) | 将TreeSet的“比较器、容量,所有的元素值”都写入到输出流中 | void readObject(java.io.ObjectInputStreams) | 从输入流中读取TreeSet的“比较器、容量,所有的元素值” |
三、其他知识点
1、关于 HashSet、LinkedHashSet 和 TreeSet 的区别
- HashSet 是 Set 接口的主要实现类 ,HashSet 的底层是 HashMap,线程不安全的,可以存储 null 值;
- LinkedHashSet 是 HashSet 的子类,能够按照添加的顺序遍历;
- TreeSet 底层使用红黑树,能够按照添加元素的顺序进行遍历,排序的方式可以自定义。
2、关于 红黑树的特点
- 性质 1:每个节点要么是红色,要么是黑色。
- 性质 2:根节点永远是黑色的。
- 性质 3:所有的叶节点都是空节点(即 null),并且是黑色的。
- 性质 4:每个红色节点的两个子节点都是黑色。(从每个叶子到根的路径上不会有两个连续的红色节点)
- 性质 5:从任一节点到其子树中每个叶子节点的路径都包含相同数量的黑色节点。
3、关于 TreeSet 和 TreeMap 的区别
TreeMap 和 TreeSet 是 Java Collection Framework 的两个重要成员,其中 TreeMap 是 Map 接口的常用实现类,而 TreeSet 是 Set 接口的常用实现类。虽然 TreeMap 和TreeSet 实现的接口规范不同,但 TreeSet 底层是通过 TreeMap 来实现的(如同HashSet底层是是通过HashMap来实现的一样),因此二者的实现方式完全一样。而 TreeMap 的实现就是红黑树算法
不同点:
- 最主要的区别就是 TreeSet 和 TreeMap 分别实现 Set 和 Map 接口
- TreeSet 只存储一个对象,而 TreeMap存 储两个对象 Key 和 Value(仅仅key对象有序)
- TreeSet 中不能有重复对象,而 TreeMap 中可以存在
- TreeMap 的底层采用红黑树的实现,完成数据有序的插入,排序。