本系列文章所描述的所有類或接口都是基于 JDK 1.7的源碼赠叼,在其它 JDK 的實(shí)現(xiàn)方式中可能會(huì)有所不同概耻。
一猫缭、實(shí)現(xiàn)方式
TreeSet 和 HashSet 的主要不同在于 TreeSet 對(duì)于排序的支持麻养,TreeSet 基于 TreeMap 實(shí)現(xiàn)越庇。
二罩锐、創(chuàng)建 TreeSet
此時(shí)所要做的就是創(chuàng)建一個(gè) TreeMap 對(duì)象。
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)
調(diào)用 TreeMap 的 put(Object, Object) 方法完成此操作涩惑,用要增加的元素作為 key,用之前已創(chuàng)建的一個(gè) final 的 Object 對(duì)象作為 value桑驱。
public boolean add(E e) {
return m.put(e, PRESENT)==null;
}
四竭恬、刪除元素 remove(E)
調(diào)用 TreeMap 的 remove(Object) 方法完成此操作。
public boolean remove(Object o) {
return m.remove(o)==PRESENT;
}
五熬的、遍歷元素 iterator()
調(diào)用 TreeMap 的 navigableKeySet 的 iterator 方法完成此操作痊硕。
public Iterator<E> iterator() {
return m.navigableKeySet().iterator();
}
綜上所述,TreeSet 和 HashSet 一樣押框,也是完全基于 Map 來完成的岔绸,并且同樣也不支持 get(int) 來獲取指定位置的元素,只是 TreeSet 基于的是 TreeMap橡伞,除了這些基本的 Set 實(shí)現(xiàn)外盒揉,TreeSet 還提供了一些排序方面的支持。例如傳入 Comparator 實(shí)現(xiàn)兑徘、descendingSet 以及 descendingIterator 等刚盈。
六、注意要點(diǎn)
對(duì)于 TreeSet 而言挂脑,最要注意的有以下幾點(diǎn):
- TreeSet 基于 TreeMap 實(shí)現(xiàn)藕漱,支持排序欲侮;
- TreeSet 是非線程安全的。