引言
继上篇文章讲过了Java中的Map之后,接下来我们会关注另外一种集合类型——Set。
Set直译就是集合的意思,代表中不存在重复元素的一个组合。这个定义与我们上篇文章要中介绍的Map中的key定义一致。在Map中,Key也是唯一的。所以Set也大多包含了Map。
下面是Set的类图

从类图我们也能够看出来,Set的具体实现也从是否支持并发、是否支持排序进行了分化。
具体实现
由于Set中许多类都是基于Map的,在下面列出部分直接的对应关系,就不做具体介绍了。
| Set | Map | 备注 |
|---|---|---|
| HashSet | HashMap | 非线程安全 |
| LinkedHashSet | LinkedHashMap | 非线程安全 |
| ConcurrentSkipListSet | ConcurrentSkipListMap | 线程安全 |
| TreeSet | TreeMap | 非线程安全 |
以上,就是两者之间的对应关系,实际上这些Set中都包含了对应Map作为成员变量,而Set中的元素,就对应Map中的key。
而唯一的一个例外,就是CopyOnWriteArraySet。这是基于CopyOnWriteArrayList实现的集合。
首先,看一下其成员变量
public class CopyOnWriteArraySet<E> extends AbstractSet<E>
implements java.io.Serializable {
private static final long serialVersionUID = 5457747651344034263L;
//CopyOnWriteArrayList作为成员变量
private final CopyOnWriteArrayList<E> al;
}其次,就是add方法
public boolean add(E e) {
//这里的添加,copyOnWriteArrayList会首先复制生成一个SNAPSHOT,然后在SNAPSHOT中进行添加,最后将旧的指针指向SNAPSHOT
return al.addIfAbsent(e);
}可以看到,其实都是直接调用了CopyOnWriteArrayList中的方法直接进行实现的,其它方法也都是一样。
小结
当我们了解了List,Map的结构后,再来看Set的实现就会轻松很多,因为Set实际上是基于List或是Map实现的。
版权声明:本文为Mr_SeaTurtle_原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。