zoukankan      html  css  js  c++  java
  • java.util.TreeSet源码分析

    TreeSet是基于TreeMap实现的,元素的顺序取决于元素自身的自然顺序或者在构造时提供的比较器。

    对于add,remove,contains操作,保证log(n)的时间复杂度。

    因为Set接口的定义根据equals方法,但是TreeSet接口约定元素的顺序基于compareTo或者compare方法,所以它们要保持一致性才能保证程序不会出错。

    TreeSet不是同步化的,运行在多线程环境下需要外部同步化或调用SortedSet s = Collections.synchronizedSortedSet(new TreeSet(...));方法。

    迭代器是快速失败的。

    public class TreeSet<E> extends AbstractSet<E>
        implements NavigableSet<E>, Cloneable, java.io.Serializable

    实例变量

    //TreeSet的实现基于TreeMap(TreeMap实现NavigableMap),内部维护一个NavigableMap
    private transient NavigableMap<E,Object> m;
    
    //作用是把TreeSet的元素存入TreeMap中时,元素作为键,PRESENT作为值
    private static final Object PRESENT = new Object();

    构造器

        //这个构造器不是导出API,在下面构造器有使用这个构造器
        TreeSet(NavigableMap<E,Object> m) {
            this.m = m;
        }
    
        //调用第一个的构造器,创建一个空的TreeSet,不提供比较器,使用元素自然顺序
        public TreeSet() {
            this(new TreeMap<E,Object>());
        }
    
        //调用第一个构造器,提供比较器,比较器由TreeMap维护,TreeSet本身没有比较器
        public TreeSet(Comparator<? super E> comparator) {
            this(new TreeMap<>(comparator));
        }
    
        //通过Collection的子类构造TreeSet,不提供比较器,使用元素的自然顺序
        public TreeSet(Collection<? extends E> c) {
            this();
            addAll(c);
        }
    
        //通过SortedSet的子类构造TreeSet,SortedSet本身可能有比较器,如果有,使用该比较器,否则使用元素自然顺序
        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();
        }

    返回一个降序的TreeSet

        public NavigableSet<E> descendingSet() {
            return new TreeSet<>(m.descendingMap());
        }

    一些基本操作

        //Set含有的元素个数    
        public int size() {
            return m.size();
        }
    
        //判断是否为空,其实就是size会否为0
        public boolean isEmpty() {
            return m.isEmpty();
        }
    
        //Set是否包含元素o
        public boolean contains(Object o) {
            return m.containsKey(o);
        }
    
        //增加一个元素,可以看到e作为键,PRESENT作为值
        public boolean add(E e) {
            return m.put(e, PRESENT)==null;
        }
    
        //删除一个元素,根据删除返回的结果是否和PRESENT等同来返回是否删除成功
        public boolean remove(Object o) {
            return m.remove(o)==PRESENT;
        }
    
        //清空Set
        public void clear() {
            m.clear();
        }

    返回子集合的操作

        //fromElement开始元素,toElement结束元素,fromInclusive,toInclusive表示是否包含边界,跟下面的返回子集合操作的参数意义一样
        public NavigableSet<E> subSet(E fromElement, boolean fromInclusive,
                                      E toElement,   boolean toInclusive) {
            return new TreeSet<>(m.subMap(fromElement, fromInclusive,
                                           toElement,   toInclusive));
        }
    
        public NavigableSet<E> headSet(E toElement, boolean inclusive) {
            return new TreeSet<>(m.headMap(toElement, inclusive));
        }
    
        public NavigableSet<E> tailSet(E fromElement, boolean inclusive) {
            return new TreeSet<>(m.tailMap(fromElement, inclusive));
        }
    
        public SortedSet<E> subSet(E fromElement, E toElement) {
            return subSet(fromElement, true, toElement, false);
        }
    
        public SortedSet<E> headSet(E toElement) {
            return headSet(toElement, false);
        }
    
        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小的最大元素,不包括e
        public E lower(E e) {
            return m.lowerKey(e);
        }
    
        //返回比e小的最大元素,包括e
        public E floor(E e) {
            return m.floorKey(e);
        }
    
        //返回比e大的最小元素,包括e
        public E ceiling(E e) {
            return m.ceilingKey(e);
        }
    
        //返回比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();
        }

    支持clone

        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 stuff
            s.defaultWriteObject();
    
            // Write out Comparator
            s.writeObject(m.comparator());
    
            // Write out size
            s.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 stuff
            s.defaultReadObject();
    
            // Read in Comparator
            @SuppressWarnings("unchecked")
                Comparator<? super E> c = (Comparator<? super E>) s.readObject();
    
            // Create backing TreeMap
            TreeMap<E,Object> tm = new TreeMap<>(c);
            m = tm;
    
            // Read in size
            int size = s.readInt();
    
            tm.readTreeSet(size, s, PRESENT);
        }
  • 相关阅读:
    Brain network involved in autonomic functions 与自主功能相关的大脑网络
    Brief summary of classical components of ERP 事件相关成分(ERP)经典成分小结
    ICA & Percentage Variance Account For (PVAF)
    数据处理中白化Whitening的作用图解分析
    Loadings vs eigenvectors in PCA 主成分分析(PCA)中的负荷和特征向量
    主成分分析(PCA)和独立成分分析(ICA)相关资料
    Sketch of heart and QRS complex 心脏及QRS波群简图
    Brain Network visulation in EEG 脑电网络可视化
    Phase Locking Value (PLV) 神经信号的锁相值
    ubuntu16.04下的一些基本操作笔记
  • 原文地址:https://www.cnblogs.com/13jhzeng/p/5845845.html
Copyright © 2011-2022 走看看