前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >集合系列 Set(八):TreeSet

集合系列 Set(八):TreeSet

作者头像
陈树义
发布2019-08-29 16:41:21
3510
发布2019-08-29 16:41:21
举报
文章被收录于专栏:陈树义陈树义

TreeSet 是 Set 集合的红黑树实现,但其内部并没有具体的逻辑,而是直接使用 TreeMap 对象实现。我们先来看看 TreeSet 的定义。

代码语言:javascript
复制
public class TreeSet<E> extends AbstractSet<E>
    implements NavigableSet<E>, Cloneable, java.io.Serializable

可以看到 TreeSet 实现了 NavigableSet 接口,而 NavigableSet 接口又继承了 接口。SortedSet 接口又继承了 Set 接口。

代码语言:javascript
复制
public interface NavigableSet<E> extends SortedSet<E>

public interface SortedSet<E> extends Set<E> 

TreeSet 的类继承关系如下图所示。

原理

我们还是通过类成员变量、构造方法、核心方法来解析 TreeSet 的实现。

类成员变量

代码语言:javascript
复制
// 具体的实现类
private transient NavigableMap<E,Object> m;
// Map的value
private static final Object PRESENT = new Object();

构造方法

TreeSet 一共有 5 个构造方法,如下所示:

代码语言:javascript
复制
// 默认采用TreeMap实现
public TreeSet() {
    this(new TreeMap<E,Object>());
}
// 指定实现类型
TreeSet(NavigableMap<E,Object> m) {
    this.m = m;
}
// 指定TreeMap的比较器
public TreeSet(Comparator<? super E> comparator) {
    this(new TreeMap<>(comparator));
}
// 指定初始集合
public TreeSet(Collection<? extends E> c) {
    this();
    addAll(c);
}
// 指定比较器以及初始集合
public TreeSet(SortedSet<E> s) {
    this(s.comparator());
    addAll(s);
}

可以看到,如果我们没有指定传入的 Map 类型,TreeSet 将自动采用 TreeMap 来实现。而如果你传入了 NavigableMap 类型的对象,那么就按照你传入的对象类型来实现。

核心方法

TreeSet 的核心方法实现直接采用了 TreeMap 的实现,无论是 add 还是 remove 方法。

代码语言:javascript
复制
public boolean add(E e) {
    return m.put(e, PRESENT)==null;
}
    
public boolean remove(Object o) {
    return m.remove(o)==PRESENT;
}

总结

TreeSet 的实现与 HashSet 类似,都是直接采用了 TreeMap 的方法实现。所以如果理解了 TreeMap,那么 TreeSet 就很简单了。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019-08-28 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 原理
    • 类成员变量
      • 构造方法
        • 核心方法
        • 总结
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档