特性
public class CopyOnWriteArraySet<E> extends AbstractSet<E>
implements java.io.Serializable {
基本参数
//基于CopyOnWriteArrayList的存储
private final CopyOnWriteArrayList<E> al;
构造方法
发现CopyOnWriteArraySet是基于CopyOnWriteArrayList
//底层创建的一个CopyOnWriteArrayList
public CopyOnWriteArraySet() {
al = new CopyOnWriteArrayList<E>();
}
//将Collection元素添加到CopyOnWriteArrayList
public CopyOnWriteArraySet(Collection<? extends E> c) {
if (c.getClass() == CopyOnWriteArraySet.class) {
@SuppressWarnings("unchecked") CopyOnWriteArraySet<E> cc =
(CopyOnWriteArraySet<E>)c;
al = new CopyOnWriteArrayList<E>(cc.al);
}
else {
al = new CopyOnWriteArrayList<E>();
al.addAllAbsent(c);
}
}
总结
CopyOnWriteArraySet是基于CopyOnWriteArrayList的实现,前面讲过CopyOnWriteArrayList,在这就简单说下特性:
- 它最适合于具有以下特征的应用程序:Set 大小通常保持很小,只读操作远多于可变操作,需要在遍历期间防止线程间的冲突。
- 它是线程安全的。
- 因为通常需要复制整个基础数组,所以可变操作(add()、set() 和 remove() 等等)的开销很大。
- 迭代器支持hasNext(), next()等不可变操作,但不支持可变 remove()等 操作。
- 使用迭代器进行遍历的速度很快,并且不会与其他线程发生冲突。在构造迭代器时,迭代器依赖于不变的数组快照。