【源码】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