Java集合之Set

来源:互联网 发布:特朗普 知乎 编辑:程序博客网 时间:2024/05/17 01:00

Set是单元素容器,同时元素是不重复的,Java中直接利用Map key唯一性,底层是用了Map的实现,对应的value都是同一个static Object.

Set 内部结构 HashSet HashMap LinkedHashSet LinkedHashMap TreeSet TreeMap EnumSet ConcurrentSkipListSet ConcurrentSkipListMap的并发优化的SortedSet CopyOnWriteArraySet CopyOnWriteArrayList的并发优化的Set,利用addIfAbsent去重

EnumSet有自己的实现,ConcurrentHashSet呢?JDK没有,Guava有,直接用Collections实现。

java.util.Collections.newSetFromMap(new ConcurrentHashMap())

以HashSet为列简单,看看其构造函数及add方法就知其原理:

private static final Object PRESENT = new Object();/** * Constructs a new, empty set; the backing <tt>HashMap</tt> instance has * default initial capacity (16) and load factor (0.75). */public HashSet() {    map = new HashMap<>();}public boolean add(E e) {    return map.put(e, PRESENT)==null;}

HashSet实现了Collection和Set接口,Collection在List中亦介绍,我们主要看看Set主要方法。

public interface Set<E> extends Collection<E> {    // Query Operations    int size();    boolean isEmpty();    boolean contains(Object o);    Iterator<E> iterator();    Object[] toArray();    <T> T[] toArray(T[] a);    // Modification Operations    boolean add(E e);    boolean remove(Object o);    // Bulk Operations    boolean containsAll(Collection<?> c);    boolean addAll(Collection<? extends E> c);    boolean retainAll(Collection<?> c);    boolean removeAll(Collection<?> c);    void clear();    // Comparison and hashing    boolean equals(Object o);    int hashCode();}

继承自Colleciton,但其实没有添加任何方法,主要从语义上起标记类型的作用。