引言
继上篇文章讲过了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
实现的。