美文网首页数据结构和算法分析
Java集合源码分析-TreeSet

Java集合源码分析-TreeSet

作者: 宛丘之上兮 | 来源:发表于2018-11-13 20:37 被阅读0次

    上篇文章分析完HashSet和LinkedHashSet的源码,我们清楚:HashSet是无序的、不重复的、允许最多一个null,LinkedHashSet是按插入顺序存储的,而这篇文章分析的TreeSet利用二叉排序树可以根据指定的Comparator进行排序,如果不指定Comparator那么就是自然排序(从小到大)。

    TreeSet类图

    TreeSet类图

    和HashSet不同的一点是:HashSet实现了Set,而TreeSet实现了NavigableSet。

    TreeSet构造器

    TreeSet提供了5个构造器:

        public TreeSet() {
            this(new TreeMap<E,Object>());
        }
    
        TreeSet(NavigableMap<E,Object> m) {
            this.m = m;
        }
    
        public TreeSet(Comparator<? super E> comparator) {
            this(new TreeMap<>(comparator));
        }
    
        public TreeSet(Collection<? extends E> c) {
            this();
            addAll(c);
        }
    
        public TreeSet(SortedSet<E> s) {
            this(s.comparator());
            addAll(s);
        }
    

    可以看到,第三个和第五个构造器提供了Comparator,那么会根据Comparator进行排序,其余三个构造器会进行自然排序(从小到大)。而且对TreeSet的所有操作,都是在一个TreeMap的成员变量上进行的。

    TreeSet核心操作

    TreeSet核心操作包括:

    1. add(val:E):boolean
    2. remove(ob:Object):boolean
    3. clone():Object
    4. contains(val:Object):boolean
    5. lower(e:E):E
    6. higher(e:E):E
    7. floor(e:E):E
    8. ceiling(e:E):E
    9. headSet(e:E, inclusive: boolean):NavigableSet<E>
    10. tailSet(e:E, inclusive: boolean):NavigableSet<E>
      TreeSet的核心操作都是操作TreeMap,具体可以分析TreeMap源码。

    add(val:E):boolean

        public boolean add(E e) {
            return m.put(e, PRESENT)==null;
        }
    

    remove(ob:Object):boolean

        public boolean remove(Object o) {
            return m.remove(o)==PRESENT;
        }
    

    clone():Object

        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;
        }
    

    contains(val:Object):boolean

        public boolean contains(Object o) {
            return m.containsKey(o);
        }
    

    lower(e:E):E

        public E lower(E e) {
            return m.lowerKey(e);
        }
    

    返回此 set 中严格小于给定元素的最大元素;如果不存在这样的元素,则返回null。

    higher(e:E):E

        public E higher(E e) {
            return m.higherKey(e);
        }
    

    返回此 set中严格大于给定元素的最小元素;如果不存在这样的元素,则返回null。

    floor(e:E):E

        public E floor(E e) {
            return m.floorKey(e);
        }
    

    返回此 set 中小于等于给定元素的最大元素;如果不存在这样的元素,则返回null。

    ceiling(e:E):E

        public E ceiling(E e) {
            return m.ceilingKey(e);
        }
    

    返回此 set中大于等于给定元素的最小元素;如果不存在这样的元素,则返回null。

    headSet(e:E, inclusive: boolean):NavigableSet<E>

        public NavigableSet<E> headSet(E toElement, boolean inclusive) {
            return new TreeSet<>(m.headMap(toElement, inclusive));
        }
    

    返回此 set 的部分视图,其元素小于(或等于,如果inclusive为 true)toElement。

    tailSet(e:E, inclusive: boolean):NavigableSet<E>

        public NavigableSet<E> tailSet(E fromElement, boolean inclusive) {
            return new TreeSet<>(m.tailMap(fromElement, inclusive));
        }
    

    返回此 set 的部分视图,其元素大于(或等于,如果inclusive为 true)toElement。

    相关文章

      网友评论

        本文标题:Java集合源码分析-TreeSet

        本文链接:https://www.haomeiwen.com/subject/fialfqtx.html