yaochow@home:~$

【源码】Set

Set这部分没有什么可说的,基本都是通过Map的key来实现的。

java.util.Set

/*Set继承于Collection,是一个不予许有重复元素的集合,定义了集合的基础方法*/
public interface Set<E> extends Collection<E> {
    //...
}

java.util.AbstractSet

/*AbstractSet继承于AbstractCollection,实现了Set接口*/
public abstract class AbstractSet<E> extends AbstractCollection<E> implements Set<E> {
    //...
}

java.util.HashSet

/*HashSet继承于AbstractSet,实现了Set接口、Cloneable(克隆)、Serializable(序列化)。内部是通过HashMap的Key来实现的,非线程安全*/
public class HashSet<E>
    extends AbstractSet<E>
    implements Set<E>, Cloneable, java.io.Serializable
{
    private transient HashMap<E,Object> map;

    private static final Object PRESENT = new Object();
    /*HashSet是通过HashMap的Key结构实现的*/
    public HashSet() {
        map = new HashMap<>();
    }
    
    public boolean add(E e) {
    	/*HashSet的add方法是将元素作为map的key,以new Object()为value,如果已经有此元素返回false*/
        return map.put(e, PRESENT)==null;
    }
    
 //...
}

java.util.TreeSet

/*TreeSet继承于AbstractSet,实现了NavigableSet。内部默认通过TreeMap的key实现。非线程安全*/
public class TreeSet<E> extends AbstractSet<E>
    implements NavigableSet<E>, Cloneable, java.io.Serializable
{
    private transient NavigableMap<E,Object> m;
    
    private static final Object PRESENT = new Object();
    
    public TreeSet() {
    	/*默认使用TreeMap实现*/
        this(new TreeMap<E,Object>());
    }
    
    public boolean add(E e) {
        return m.put(e, PRESENT)==null;
    }
    //。。。
}

总结

set就是对map key的应用。

以上源码均来自JDK1.8.0_171