一、CopyOnWriteArraySet介绍
它是线程安全的无序的集合,可以将它理解成线程安全的HashSet,有意思的是,CopyOnWriteArraySet和HashSet虽然都继承于共同的父类都继承于共同的父类;但是,HashSet是通过“散列表(HashMap)”实现的,而CopyOnWriteArraySet则是通过“动态数组(CopyOnWriteArrayList)”实现的,并不是散列表。和CopyOnWriteArrayList类似,CopyOnWriteArraySet具有以下特性:
1、它最适合于具有以下特征的应用程序:Set 大小通常保持很小,只读操作远多于可变操作,需要在遍历期间防止线程间的冲突。
2、它是线程安全的。
3、因为通常需要复制整个基础数组,所以可变操作(add()、set() 和remove() 等等)的开销很大。
4、迭代器支持hasNext(), next()等不可变操作,但不支持可变remove()等操作。
5、使用迭代器进行遍历的速度很快,并且不会与其他线程发生冲突。在构造迭代器时,迭代器依赖于不变的数组快照。
二、CopyOnWriteArraySet的一些方法
1、add(E e) :如果指定元素并不存在于此 set 中,则添加它,返回值为Boolean。
2、clear():移除此 set 中的所有元素。
3、contains(Object o) : 如果此 set 包含指定元素,则返回 true。
4、equals(Object o) :比较指定对象与此 set 的相等性,返回值为 boolean 。
5、isEmpty() :如果此 set 不包含任何元素,则返回 true。
6、iterator() :返回按照元素添加顺序在此 set 中包含的元素上进行迭代的迭代器,返回值为 Iterator。
7、remove(Object o) :如果指定元素存在于此 set 中,则将其移除,返回值为 boolean 。
8、size() :返回此 set 中的元素数目。
9、Object[] toArray() : 返回一个包含此 set 所有元素的数组。
三、Java代码示例
package chapter3.copyonwrite;
import java.util.Iterator;
import java.util.concurrent.CopyOnWriteArraySet;
/**
* @author czd
*/
public class CopyOnWriteArraySetTest {
public static void main(String[] args) {
/**
* CopyOnWriteArraySet():
* 创建一个空 set。
* CopyOnWriteArraySet(Collection<? extends E> c):
* 创建一个包含指定 collection 所有元素的 set。
*/
/**
* 1、add(E e):如果指定元素并不存在于此 set 中,则添加它,返回值为Boolean
*/
CopyOnWriteArraySet<Integer> copyOnWriteArraySet = new CopyOnWriteArraySet<>();
Boolean addBoolean = copyOnWriteArraySet.add(1);
System.out.println("是否添加成功?" + addBoolean);
/**
* 2、contains(Object o) :如果此 set 包含指定元素,则返回 true
*/
Boolean containsBoolean = copyOnWriteArraySet.contains(1);
System.out.println("CopyOnWriteArraySet中是否存在1?" + containsBoolean);
/**
* 3、isEmpty() :如果此 set 不包含任何元素,则返回 true。
*/
Boolean isEmptyBoolean = copyOnWriteArraySet.isEmpty();
System.out.println("copyOnWriteArraySet是否为空?" + isEmptyBoolean);
/**
* 4、iterator():返回按照元素添加顺序在此 set 中包含的元素上进行迭代的迭代器,Iterator<E>。
*/
copyOnWriteArraySet.add(2);
copyOnWriteArraySet.add(3);
copyOnWriteArraySet.add(4);
copyOnWriteArraySet.add(5);
Iterator<Integer> iterator = copyOnWriteArraySet.iterator();
while (iterator.hasNext()){
System.out.println("Iterator的结果: " + iterator.next());
}
/**
* 5、remove(Object o) :如果指定元素存在于此 set 中,则将其移除,返回值为Boolean。
*/
Boolean removeBoolean = copyOnWriteArraySet.remove(5);
System.out.println("是否移除5成功?" + removeBoolean);
/**
* 6、size() :返回此 set 中的元素数目。
*/
CopyOnWriteArraySet<Integer> copyOnWriteArraySet1 = new CopyOnWriteArraySet<>();
copyOnWriteArraySet1.add(1);
copyOnWriteArraySet1.add(2);
copyOnWriteArraySet1.add(3);
copyOnWriteArraySet1.add(1);
copyOnWriteArraySet1.add(3);
Integer size = copyOnWriteArraySet1.size();
System.out.println("copyOnWriteArraySet1的size: " + size);
}
}
四、CopyOnWriteArraySet其他特性介绍
1、CopyOnWriteArraySet的结构严格意义来说是一个集合,它的底层实现是利用数组,它的上层实现是CopyOnWriteArrayList。
2、CopyOnWriteArraySet是一个集合,所以它是不可以放置重复的元素的,它的取重逻辑是在add中体现的。
3、CopyOnWriteArraySet是利用CopyOnWriteArrayList来实现的,因为CopyOnWriteArrayList是线程安全的,所以CopyOnWriteArraySet操作也是线程安全的。