美文网首页
Java集合-TreeSet源码实现分析

Java集合-TreeSet源码实现分析

作者: Misout | 来源:发表于2017-08-29 14:22 被阅读89次

概述

在阅读本文时,强烈建议读者先学习TreeMap或者ConcurrentHash的相关知识:
Java集合-TreeMap深入浅出源码分析Java8
ConcurrentHashMap与红黑树实现分析Java8

来看下TreeSet源码上的英文说明:

A NavigableSet implementation based on a TreeMap.
The elements are ordered using their Comparable natural
ordering, or by a Comparator provided at set creation
time, depending on which constructor is used.
This implementation provides guaranteed log(n) time cost for the basic
operations add, remove and contains

两个信息:

1、TreeSet默认情况下是基于TreeMap实现的,是对TreeMap的封装。
2、默认情况下和TreeMap一样,采用元素的内部比较器Comparable的compareTo方法来比较元素的大小。
3、如果不用内部比较器,就需要在外部传入一个Comparator的实现类来比较。
4、由于TreeMap实现中采用红黑树实现,所以add,remove,contains方法的时间复杂度最坏情况下能保证log( n )。

类的继承关系和构造方法

public class TreeSet<E> extends AbstractSet<E>
    implements NavigableSet<E>, Cloneable, java.io.Serializable
{
    // 存放元素的Map,必须是实现了NavigableMap接口的类
    private transient NavigableMap<E,Object> m;

    // 一个虚拟值,用于添加元素到map中时,key为元素的值,value用此虚拟值代替
    private static final Object PRESENT = new Object();
    
    // 默认构造方法用TreeMap来实现
    public TreeSet() {
        this(new TreeMap<E,Object>());
    }
    
    // 也可以自定义实现了NavigableMap接口的Map来作为实现
    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);
    }
}

从源码看,TreeSet继承自AbstractSet,并实现了NavigableSet接口。其大部分构造方法都是以TreeMap来实现,也支持自定义的Map来实现,当然我们都建议不用自定义的Map。

基本操作

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

public int size() {
    return m.size();
}

public boolean isEmpty() {
    return m.isEmpty();
}

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

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

public void clear() {
    m.clear();
}

基本操作都是调用TreeMap的方法来实现。

Java集合-TreeMap深入浅出源码分析Java8
ConcurrentHashMap与红黑树实现分析Java8

相关文章

网友评论

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

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