TreeSet属于Java集合框架的一部分,是一个有序的集合,本篇重点详解TreeSet的底层结构与原理@mikechen
TreeSet简介
TreeSet是一个包含有序的且没有重复元素的集合,通过TreeMap实现。
TreeSet 是一个具有唯一元素的二叉树的集合,又被翻译为 树集,是 Java 集合框架的一部分,如下图所示:
TreeSet的特点
TreeSet的作用是提供有序的Set集合,主要特点如下:
- 不可以存储重复元素
- 没有索引
- 可以将元素按照规则进行排序
- TreeSet():根据其元素的自然排序进行排序
- TreeSet(Comparator comparator) :根据指定的比较器进行排序
TreeSet数据结构
TreeSet 是通过 TreeMap 实现的一个有序的、不可重复的集合,底层维护的是红黑树结构。
红黑树的特点:
- 节点不是黑色,就是红色(非黑即红);
- 根节点为黑色;
- 叶节点为黑色(叶节点是指末梢的空节点 Nil或Null);
- 一个节点为红色,则其两个子节点必须是黑色的(根到叶子的所有路径,不可能存在两个连续的红色节点);
- 每个节点到叶子节点的所有路径,都包含相同数目的黑色节点(相同的黑色高度)。
TreeSet底层原理
1.TreeSet继承关系
TreeSet继承了AbstractSet抽象类,实现了NavigableSet<E>,Cloneable,Serializable接口。
java.lang.Object ↳ java.util.AbstractCollection<E> ↳ java.util.AbstractSet<E> ↳ java.util.TreeSet<E> public class TreeSet<E> extends AbstractSet<E> implements NavigableSet<E>, Cloneable, java.io.Serializable{}
2.TreeSet构造函数
TreeSet提供了四种构造器:
3.TreeSet成员属性
// NavigableMap对象(NavigableMap下就一个TreeMap实现) private transient NavigableMap<E,Object> m; // 固定常量作为Map值 private static final Object PRESENT = new Object();
4.TreeSet基础方法
// 长度 public int size() { return m.size(); } // 是否为空 public boolean isEmpty() { return m.isEmpty(); } // 是否存在 public boolean contains(Object o) { return m.containsKey(o); } // 添加 public boolean add(E e) { return m.put(e, PRESENT)==null; } // 删除 public boolean remove(Object o) { return m.remove(o)==PRESENT; } // 清空 public void clear() { m.clear(); }
TreeSet使用示例
我们可以以任意顺序将元素插入到集合中,在对集合进行遍历时,会返回排序好的值,例如:
import java.util.TreeSet; public class TreeSetExample { public static void main(String[] args) { // 定义一个 String 类型的树集 TreeSet<String> treeset = new TreeSet<String>(); // 添加元素 treeset.add("Learning TreeSet"); treeset.add("Hello, world!"); treeset.add("ABC"); treeset.add("Yuzhou1su"); treeset.add("宇宙之一粟"); for (String ts : treeset) { System.out.println(ts); } } }
运行结果:
ABC Hello, world! Learning TreeSet Yuzhou1su 宇宙之一粟
TreeSet总结
- 底层是在TreeMap的基础上进行封装,所以结构是红黑树;
- 因为是红黑树结构,所以不需要重写hashCode()和equals()方法来保证唯一性;
- TreeMap有的特性TreeSet都有,还在这个基础上增加了保证元素唯一性的特点。
mikechen睿哥
mikechen睿哥,十余年BAT架构经验,资深技术专家,就职于阿里、淘宝、百度等一线互联网大厂。
关注「mikechen」公众号,获取更多技术干货!
后台回复【面试】即可获取《史上最全阿里Java面试题总结》,后台回复【架构】,即可获取《阿里架构师进阶专题全部合集》