手撕TreeSet

TreeSet 能够按照指定的比较方式来排序元素,它的底层实现是维护了一个 NavigableMap对象,该对象的实现是使用了 TreeMap 类。

TreeSet 继承自 AbstractSet 类,实现了 NavigableSet 接口,NavigableSet 接口又继承了 SortedSet 接口。它这样的类结构与 TreeMap 相似,TreeMap 实现了 NavigableMap 接口,NavigableMap 接口又继承了 SortedMap 接口,所以,这两类接口提供的方法也差不多,所以,TreeSet 在选择实现接口方法时,基本上使用 TreeMap 的实现就已经够了。

我们已经知道的是,关于 TreeMap ,它支持两种比较方式,一种是在构造时提供 Comparator 接口的实现,还有一种是存储的元素实现了 Comparable 接口,TreeSet 也同样支持这两种方式。有关 TreeMap 更详细的介绍可以参考文末的推荐博文。


TreeSet 提供了多个构造器,构造器中负责初始化 NavigableMap,使用 TreeMap 实现类。TreeSet 的基本操作使用 TreeMap 的基本操作实现,这些没有什么特别的地方。


TreeSet 内部维护的 NavigableMap 存放的 value 仍然是使用了一个 Object,这与 HashSet 一样,原因就不在此阐述了。


TreeSet 能否存储 null 值呢?这与 TreeMap 能否使用 null 作为 key 的问题一样。

    public boolean add(E e) {
        return m.put(e, PRESENT)==null;
    }

在提供比较器的情况下,如果比较器本身对于 null 的处理是合法的,那么 add 操作就不会产生 NPE。但在使用存储元素实现 Comparable 接口的情况下,使用 null 会产生 NPE。

关于 TreeSet 没有什么需要特别介绍的了,理解了 TreeMap 很自然就理解了它。

Set 接口总结

Set 接口提供了三种常用的实现类:

  1. HashSet :底层实现是 HashMap ,继承自 AbstractSetkey 可以为 null
  2. LinkedHashSet:继承自 HashSet ,底层实现是 LinkedHashMap,支持按插入顺序遍历元素,key 可以为 null
  3. TreeSet:底层实现是 TreeMap,继承自 AbstractSet;提供了按自定义顺序遍历元素,并且可以进行截取集合等操作,key 能不能为 null 需要视情况而定。

推荐博文


手撕TreeMap


我与风来


认认真真学习,做思想的产出者,而不是文字的搬运工
错误之处,还望指出

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值