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
接口提供了三种常用的实现类:
HashSet
:底层实现是HashMap
,继承自AbstractSet
,key
可以为null
;LinkedHashSet
:继承自HashSet
,底层实现是LinkedHashMap
,支持按插入顺序遍历元素,key
可以为null
;TreeSet
:底层实现是TreeMap
,继承自AbstractSet
;提供了按自定义顺序遍历元素,并且可以进行截取集合等操作,key
能不能为null
需要视情况而定。
推荐博文
我与风来
认认真真学习,做思想的产出者,而不是文字的搬运工
错误之处,还望指出