简介
TreeSet 底层是采用TreeMap实现的一种Set, 所以它是有序的,同样也是非线程安全的
继承关系
源码解析
经过前面我们学习HashSet和LinkedHashSet,基本上已经掌握了Set实现的套路了
package java.util;// TreeSet实现了NavigableSet接口,所以它是有序的public class TreeSet<E> extends AbstractSet<E>implements NavigableSet<E>, Cloneable, java.io.Serializable{// 元素存储在NavigableMap中// 注意它不一定就是TreeMapprivate transient NavigableMap<E,Object> m;// 虚拟元素, 用来作为value存储在map中private static final Object PRESENT = new Object();// 直接使用传进来的NavigableMap存储元素// 这里不是深拷贝,如果外面的map有增删元素也会反映到这里// 而且, 这个方法不是public的, 说明只能给同包使用TreeSet(NavigableMap<E,Object> m) {this.m = m;}// 使用TreeMap初始化public TreeSet() {this(new TreeMap<E,Object>());}// 使用带comparator的TreeMap初始化public TreeSet(Comparator<? super E> comparator) {this(new TreeMap<>(comparator));}// 将集合c中的所有元素添加的TreeSet中public TreeSet(Collection<? extends E> c) {this();addAll(c);}// 将SortedSet中的所有元素添加到TreeSet中public TreeSet(SortedSet<E> s) {this(s.comparator());addAll(s);}// 迭代器public Iterator<E> iterator() {return m.navigableKeySet().iterator();}// 逆序迭代器public Iterator<E> descendingIterator() {return m.descendingKeySet().iterator();}// 以逆序返回一个新的TreeSetpublic NavigableSet<E> descendingSet() {return new TreeSet<>(m.descendingMap());}// 元素个数public int size() {return m.size();}// 判断是否为空public boolean isEmpty() {return m.isEmpty();}// 判断是否包含某元素public boolean contains(Object o) {return m.containsKey(o);}// 添加元素, 调用map的put()方法, value为PRESENTpublic boolean add(E e) {return m.put(e, PRESENT)==null;}// 删除元素public boolean remove(Object o) {return m.remove(o)==PRESENT;}// 清空所有元素public void clear() {m.clear();}// 添加集合c中的所有元素public boolean addAll(Collection<? extends E> c) {// 满足一定条件时直接调用TreeMap的addAllForTreeSet()方法添加元素if (m.size()==0 && c.size() > 0 &&c instanceof SortedSet &&m instanceof TreeMap) {SortedSet<? extends E> set = (SortedSet<? extends E>) c;TreeMap<E,Object> map = (TreeMap<E, Object>) m;Comparator<?> cc = set.comparator();Comparator<? super E> mc = map.comparator();if (cc==mc || (cc != null && cc.equals(mc))) {map.addAllForTreeSet(set, PRESENT);return true;}}// 不满足上述条件, 调用父类的addAll()通过遍历的方式一个一个地添加元素return super.addAll(c);}// 子set(NavigableSet中的方法)public NavigableSet<E> subSet(E fromElement, boolean fromInclusive,E toElement, boolean toInclusive) {return new TreeSet<>(m.subMap(fromElement, fromInclusive,toElement, toInclusive));}// 头set(NavigableSet中的方法)public NavigableSet<E> headSet(E toElement, boolean inclusive) {return new TreeSet<>(m.headMap(toElement, inclusive));}// 尾set(NavigableSet中的方法)public NavigableSet<E> tailSet(E fromElement, boolean inclusive) {return new TreeSet<>(m.tailMap(fromElement, inclusive));}// 子set(SortedSet接口中的方法)public SortedSet<E> subSet(E fromElement, E toElement) {return subSet(fromElement, true, toElement, false);}// 头set(SortedSet接口中的方法)public SortedSet<E> headSet(E toElement) {return headSet(toElement, false);}// 尾set(SortedSet接口中的方法)public SortedSet<E> tailSet(E fromElement) {return tailSet(fromElement, true);}// 比较器public Comparator<? super E> comparator() {return m.comparator();}// 返回最小的元素public E first() {return m.firstKey();}// 返回最大的元素public E last() {return m.lastKey();}// 返回小于e的最大的元素public E lower(E e) {return m.lowerKey(e);}// 返回小于等于e的最大的元素public E floor(E e) {return m.floorKey(e);}// 返回大于等于e的最小的元素public E ceiling(E e) {return m.ceilingKey(e);}// 返回大于e的最小的元素public E higher(E e) {return m.higherKey(e);}// 弹出最小的元素public E pollFirst() {Map.Entry<E,?> e = m.pollFirstEntry();return (e == null) ? null : e.getKey();}public E pollLast() {Map.Entry<E,?> e = m.pollLastEntry();return (e == null) ? null : e.getKey();}// 克隆方法@SuppressWarnings("unchecked")public Object clone() {TreeSet<E> clone;try {clone = (TreeSet<E>) super.clone();} catch (CloneNotSupportedException e) {throw new InternalError(e);}clone.m = new TreeMap<>(m);return clone;}// 序列化写出方法private void writeObject(java.io.ObjectOutputStream s)throws java.io.IOException {// Write out any hidden stuffs.defaultWriteObject();// Write out Comparators.writeObject(m.comparator());// Write out sizes.writeInt(m.size());// Write out all elements in the proper order.for (E e : m.keySet())s.writeObject(e);}// 序列化写入方法private void readObject(java.io.ObjectInputStream s)throws java.io.IOException, ClassNotFoundException {// Read in any hidden stuffs.defaultReadObject();// Read in Comparator@SuppressWarnings("unchecked")Comparator<? super E> c = (Comparator<? super E>) s.readObject();// Create backing TreeMapTreeMap<E,Object> tm = new TreeMap<>(c);m = tm;// Read in sizeint size = s.readInt();tm.readTreeSet(size, s, PRESENT);}// 可分割的迭代器public Spliterator<E> spliterator() {return TreeMap.keySpliteratorFor(m);}// 序列化idprivate static final long serialVersionUID = -2479143000061671589L;}
源码比较简单,基本都是调用map 相应的方法。
总结
(1)TreeSet底层使用NavigableMap存储元素;
(2)TreeSet是有序的;
(3)TreeSet是非线程安全的;
(4)TreeSet实现了NavigableSet接口,而NavigableSet继承自SortedSet接口;
(5)TreeSet实现了SortedSet接口
