CopyOnWriteArraySet 的构造函数

  • CopyOnWriteArraySet() :创建一个空集。
  • CopyOnWriteArraySet(Collection c) :创建一个包含指定集合元素的集合,按照集合迭代器返回的顺序。

CopyOnWriteArraySet 的层次结构

CopyOnWriteArraySet类扩展了 AbstractSet类并实现了 Serializable接口。

public class CopyOnWriteArraySet<E>
		extends AbstractSet<E>
		implements Serializable
{
	private final CopyOnWriteArrayList<E> al;
	//implementation
}

CopyOnWriteArraySet 特点

  • 作为正常的集合数据结构,它不允许重复。
  • CopyOnWriteArraySet 类实现了 Serializable接口并扩展了 AbstractSet类。
  • 使用 CopyOnWriteArraySet 的更新操作成本很高,因为每个突变都会创建底层数组的克隆副本并向其添加/更新元素。
  • 它是 HashSet 的线程安全版本。每个访问该集合的线程都会看到它自己版本的在初始化该集合的迭代器时创建的后备数组的快照。
  • 因为它在创建迭代器时获取底层数组的快照,所以它不会抛出 ConcurrentModificationException 。
  • 不支持迭代器上的变异操作。这些方法抛出 UnsupportedOperationException
  • CopyOnWriteArraySet 是同步 Set 的并发替代品,并在迭代数量超过突变时提供更好的并发性。
  • 它允许重复元素和异构对象(使用泛型来获取编译时错误)。
  • 因为它每次创建迭代器时都会创建一个底层数组的新副本,所以性能比 HashSet 慢。
更多: zhilu jiaocheng

Java CopyOnWriteArraySet 示例

CopyOnWriteArraySet<Integer> set = new CopyOnWriteArraySet<>(Arrays.asList(1,2,3));
System.out.println(set);	//[1, 2, 3]
//Get iterator 1
Iterator<Integer> itr1 = set.iterator();
//Add one element and verify set is updated
set.add(4);
System.out.println(set);	//[1, 2, 3, 4]
//Get iterator 2
Iterator<Integer> itr2 = set.iterator();
System.out.println("====Verify Iterator 1 content====");
itr1.forEachRemaining(System.out :: println);	//1,2,3
System.out.println("====Verify Iterator 2 content====");
itr2.forEachRemaining(System.out :: println);	//1,2,3,4

输出:

[1, 2, 3]
[1, 2, 3, 4]
====Verify Iterator 1 content====
1
2
3
====Verify Iterator 2 content====
1
2
3
4
Java CopyOnWriteArraySet

Java CopyOnWriteArraySet 是 HashSet 的线程安全变体,它使用底层的“CopyOnWriteArrayList”进行所有操作。

与 CopyOnWriteArrayList 类似,它的不可变快照样式迭代器方法在创建迭代器时使用对数组状态(在后备列表内)的引用。

CopyOnWriteArraySet 的方法

  • boolean add(object o) :如果指定的元素尚不存在,则将其添加到此集合中。
  • boolean addAll(collection c) :如果指定集合中的所有元素尚不存在,则将其添加到此集合中。
  • void clear() :从此集合中删除所有元素。
  • boolean contains(Object o) :如果此集合包含指定的元素,则返回 true。
  • boolean isEmpty() :如果此集合不包含任何元素,则返回 true。
  • Iterator iterator() :按照添加这些元素的顺序,在此集合中包含的元素上返回一个迭代器。
  • boolean remove(Object o) :如果指定的元素存在,则从该集合中移除该元素。
  • int size() :返回此集合中的元素数。
日期:2020-09-17 00:09:47 来源:oir作者:oir