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,但其实没有添加任何方法,主要从语义上起标记类型的作用。