本系列文章所描述的所有类或接口都是基于 JDK 1.7的源码,在其它 JDK 的实现方式中可能会有所不同。
一、实现方式
TreeSet 和 HashSet 的主要不同在于 TreeSet 对于排序的支持,TreeSet 基于 TreeMap 实现。
二、创建 TreeSet
此时所要做的就是创建一个 TreeMap 对象。
public TreeSet() {
this(new TreeMap<E,Object>());
}
TreeSet(NavigableMap<E,Object> m) {
this.m = m;
}
public TreeSet(Collection<? extends E> c) {
this();
addAll(c);
}
public TreeSet(Comparator<? super E> comparator) {
this(new TreeMap<>(comparator));
}
public TreeSet(SortedSet<E> s) {
this(s.comparator());
addAll(s);
}
三、添加元素 add(E)
调用 TreeMap 的 put(Object, Object) 方法完成此操作,用要增加的元素作为 key,用之前已创建的一个 final 的 Object 对象作为 value。
public boolean add(E e) {
return m.put(e, PRESENT)==null;
}
四、删除元素 remove(E)
调用 TreeMap 的 remove(Object) 方法完成此操作。
public boolean remove(Object o) {
return m.remove(o)==PRESENT;
}
五、遍历元素 iterator()
调用 TreeMap 的 navigableKeySet 的 iterator 方法完成此操作。
public Iterator<E> iterator() {
return m.navigableKeySet().iterator();
}
综上所述,TreeSet 和 HashSet 一样,也是完全基于 Map 来完成的,并且同样也不支持 get(int) 来获取指定位置的元素,只是 TreeSet 基于的是 TreeMap,除了这些基本的 Set 实现外,TreeSet 还提供了一些排序方面的支持。例如传入 Comparator 实现、descendingSet 以及 descendingIterator 等。
六、注意要点
对于 TreeSet 而言,最要注意的有以下几点:
- TreeSet 基于 TreeMap 实现,支持排序;
- TreeSet 是非线程安全的。