TreeSet详解(底层数据结构与原理用法)

TreeSet详解(底层数据结构与原理用法)-mikechen

TreeSet属于Java集合框架的一部分,是一个有序的集合,本篇重点详解TreeSet的底层结构与原理@mikechen

TreeSet简介

TreeSet是一个包含有序的且没有重复元素的集合,通过TreeMap实现。

TreeSet 是一个具有唯一元素的二叉树的集合,又被翻译为 树集,是 Java 集合框架的一部分,如下图所示:

TreeSet详解(底层数据结构与原理用法)-mikechen

 

TreeSet的特点

TreeSet的作用是提供有序的Set集合,主要特点如下:

  • 不可以存储重复元素
  • 没有索引
  • 可以将元素按照规则进行排序
  • TreeSet():根据其元素的自然排序进行排序
  • TreeSet(Comparator comparator) :根据指定的比较器进行排序

 

TreeSet数据结构

TreeSet 是通过 TreeMap 实现的一个有序的、不可重复的集合,底层维护的是红黑树结构。

TreeSet详解(底层数据结构与原理用法)-mikechen

红黑树的特点:

  • 节点不是黑色,就是红色(非黑即红);
  • 根节点为黑色;
  • 叶节点为黑色(叶节点是指末梢的空节点 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提供了四种构造器:

TreeSet详解(底层数据结构与原理用法)-mikechen

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,10年+大厂架构经验,BAT资深面试官,就职于阿里巴巴、淘宝、百度等一线互联网大厂。

👇阅读更多mikechen架构文章👇

阿里架构 |双11秒杀 |分布式架构 |负载均衡 |单点登录 |微服务 |云原生 |高并发 |架构师

以上

关注作者「mikechen」公众号,获取更多技术干货!

后台回复架构,即可获取《阿里架构师进阶专题全部合集》,后台回复面试即可获取《史上最全阿里Java面试题总结

评论交流
    说说你的看法