模块 java.base

类 CopyOnWriteArraySet<E>

java.lang.Object
java.util.AbstractCollection <E>
java.util.AbstractSet <E>
java.util.concurrent.CopyOnWriteArraySet<E>
类型参数:
E - 该集合中元素的类型
所有已实现的接口:
Serializable , Iterable<E> , Collection<E> , Set<E>

public class CopyOnWriteArraySet<E> extends AbstractSet <E> implements Serializable
一个 Set 使用内部 CopyOnWriteArrayList 进行所有操作。因此,它具有相同的基本属性:
  • 它最适合集合大小通常保持较小、只读操作远远多于可变操作的应用程序,并且您需要防止遍历期间线程之间的干扰。
  • 它是线程安全的。
  • 可变操作(addsetremove 等)非常昂贵,因为它们通常需要复制整个底层数组。
  • 迭代器不支持可变的 remove 操作。
  • 通过迭代器遍历速度很快,不会遇到其他线程的干扰。迭代器依赖于在构造迭代器时数组不变的快照。

示例用法。以下代码草图使用写时复制集来维护一组处理程序对象,这些对象在状态更新时执行某些操作。

 
 class Handler { void handle() { ... } }

 class X {
  private final CopyOnWriteArraySet<Handler> handlers
   = new CopyOnWriteArraySet<>();
  public void addHandler(Handler h) { handlers.add(h); }

  private long internalState;
  private synchronized void changeState() { internalState = ...; }

  public void update() {
   changeState();
   for (Handler handler : handlers)
    handler.handle();
  }
 } 

此类是 Java 集合框架 的成员。

自从:
1.5
参见:
  • 构造方法总结

    构造方法
    构造方法
    描述
    创建一个空集。
    创建一个包含指定集合的所有元素的集合。
  • 方法总结

    修饰符和类型
    方法
    描述
    boolean
    add(E e)
    如果指定的元素不存在,则将其添加到此集合中。
    boolean
    addAll(Collection<? extends E> c)
    如果指定集合中的所有元素不存在,则将它们添加到此集合中。
    void
    从此集合中删除所有元素。
    boolean
    如果此集合包含指定元素,则返回 true
    boolean
    如果此集合包含指定集合的所有元素,则返回 true
    boolean
    比较指定对象与此集合是否相等。
    void
    forEach(Consumer<? super E> action)
    Iterable 的每个元素执行给定的操作,直到处理完所有元素或操作引发异常。
    boolean
    如果此集合不包含任何元素,则返回 true
    按照添加这些元素的顺序返回此集合中包含的元素的迭代器。
    boolean
    如果存在,则从此集合中移除指定元素。
    boolean
    从此集合中移除指定集合中包含的所有元素。
    boolean
    removeIf(Predicate<? super E> filter)
    移除此集合中满足给定谓词的所有元素。
    boolean
    仅保留此集合中包含在指定集合中的元素。
    int
    size()
    返回此集合中的元素数。
    按照添加这些元素的顺序在此集合中的元素上返回 Spliterator
    返回包含此集合中所有元素的数组。
    <T> T[]
    toArray(T[] a)
    返回包含此集合中所有元素的数组;返回数组的运行时类型是指定数组的类型。

    在类 java.util.AbstractSet 中声明的方法

    hashCode

    在类 java.util.AbstractCollection 中声明的方法

    toString

    在类 java.lang.Object 中声明的方法

    clone, finalize, getClass, notify, notifyAll, wait, wait, wait

    在接口 java.util.Collection 中声明的方法

    parallelStream, stream, toArray
  • 构造方法详细信息

    • CopyOnWriteArraySet

      public CopyOnWriteArraySet()
      创建一个空集。
    • CopyOnWriteArraySet

      public CopyOnWriteArraySet(Collection <? extends E > c)
      创建一个包含指定集合的所有元素的集合。
      参数:
      c - 最初包含的元素集合
      抛出:
      NullPointerException - 如果指定的集合为空
  • 方法详情

    • size

      public int size()
      返回此集合中的元素数。
      指定者:
      size 在接口 Collection<E>
      指定者:
      size 在接口 Set<E>
      返回:
      该集合中的元素数
    • isEmpty

      public boolean isEmpty()
      如果此集合不包含任何元素,则返回 true
      指定者:
      isEmpty 在接口 Collection<E>
      指定者:
      isEmpty 在接口 Set<E>
      重写:
      isEmpty 在类 AbstractCollection<E>
      返回:
      true 如果这个集合不包含任何元素
    • contains

      public boolean contains(Object  o)
      如果此集合包含指定元素,则返回 true。更正式地说,返回 true 当且仅当此集合包含元素 e 使得 Objects.equals(o, e)
      指定者:
      contains 在接口 Collection<E>
      指定者:
      contains 在接口 Set<E>
      重写:
      contains 在类 AbstractCollection<E>
      参数:
      o - 要测试其在该集合中是否存在的元素
      返回:
      true 如果此集合包含指定元素
    • toArray

      public Object [] toArray()
      返回包含此集合中所有元素的数组。如果此集合对其迭代器返回其元素的顺序作出任何保证,则此方法必须以相同的顺序返回元素。

      返回的数组将是“安全的”,因为此集合不维护对它的引用。 (换句话说,此方法必须分配一个新数组,即使此集合由数组支持)。调用者因此可以自由修改返回的数组。

      此方法充当基于数组和基于集合的 API 之间的桥梁。

      指定者:
      toArray 在接口 Collection<E>
      指定者:
      toArray 在接口 Set<E>
      重写:
      toArray 在类 AbstractCollection<E>
      返回:
      包含此集合中所有元素的数组
    • toArray

      public <T> T[] toArray(T[] a)
      返回包含此集合中所有元素的数组;返回数组的运行时类型是指定数组的类型。如果该集合适合指定的数组,则在其中返回。否则,将使用指定数组的运行时类型和此集合的大小分配一个新数组。

      如果此集合适合指定的数组并有剩余空间(即,数组的元素多于此集合),则紧接集合末尾的数组中的元素设置为 null 。 (这对于确定此集合的长度很有用仅有的如果调用者知道这个集合不包含任何空元素。)

      如果此集合对其迭代器返回其元素的顺序作出任何保证,则此方法必须以相同的顺序返回元素。

      toArray() 方法一样,此方法充当基于数组和基于集合的 API 之间的桥梁。此外,此方法允许精确控制输出数组的运行时类型,并且在某些情况下可用于节省分配成本。

      假设 x 是已知仅包含字符串的集合。以下代码可用于将集合转储到新分配的 String 数组中:

       String[] y = x.toArray(new String[0]); 
      请注意,toArray(new Object[0]) 在功能上与 toArray() 相同。
      指定者:
      toArray 在接口 Collection<E>
      指定者:
      toArray 在接口 Set<E>
      重写:
      toArray 在类 AbstractCollection<E>
      类型参数:
      T - 包含集合的数组的组件类型
      参数:
      a - 要存储此集合元素的数组,如果它足够大的话;否则,为此分配一个相同运行时类型的新数组。
      返回:
      包含此集合中所有元素的数组
      抛出:
      ArrayStoreException - 如果指定数组的运行时类型不是此集合中每个元素的运行时类型的超类型
      NullPointerException - 如果指定数组为空
    • clear

      public void clear()
      从此集合中删除所有元素。此调用返回后该集合将为空。
      指定者:
      clear 在接口 Collection<E>
      指定者:
      clear 在接口 Set<E>
      重写:
      clear 在类 AbstractCollection<E>
    • remove

      public boolean remove(Object  o)
      如果存在,则从此集合中移除指定元素。更正式地说,删除元素 e 这样 Objects.equals(o, e) 如果此集合包含这样的元素。如果此集合包含该元素,则返回 true(或者等效地,如果此集合因调用而更改)。 (一旦调用返回,此集合将不包含该元素。)
      指定者:
      remove 在接口 Collection<E>
      指定者:
      remove 在接口 Set<E>
      重写:
      remove 在类 AbstractCollection<E>
      参数:
      o - 要从此集合中删除的对象(如果存在)
      返回:
      true 如果这个集合包含指定的元素
    • add

      public boolean add(E  e)
      如果指定的元素不存在,则将其添加到此集合中。更正式地说,如果集合不包含满足 Objects.equals(e, e2) 的元素 e2,则将指定元素 e 添加到该集合。如果此集合已包含该元素,则调用保持集合不变并返回 false
      指定者:
      add 在接口 Collection<E>
      指定者:
      add 在接口 Set<E>
      重写:
      add 在类 AbstractCollection<E>
      参数:
      e - 要添加到此集合的元素
      返回:
      true 如果此集合尚未包含指定元素
    • containsAll

      public boolean containsAll(Collection <?> c)
      如果此集合包含指定集合的所有元素,则返回 true。如果指定的集合也是一个集合,如果是一个集合,则此方法返回true子集这套。
      指定者:
      containsAll 在接口 Collection<E>
      指定者:
      containsAll 在接口 Set<E>
      重写:
      containsAll 在类 AbstractCollection<E>
      参数:
      c - 要检查此集合中是否包含的集合
      返回:
      true 如果此集合包含指定集合的所有元素
      抛出:
      NullPointerException - 如果指定的集合为空
      参见:
    • addAll

      public boolean addAll(Collection <? extends E > c)
      如果指定集合中的所有元素不存在,则将它们添加到此集合中。如果指定的集合也是一个集合,则 addAll 操作有效地修改了这个集合,使其值为union两组中的。如果在操作进行时修改了指定的集合,则此操作的行为是未定义的。
      指定者:
      addAll 在接口 Collection<E>
      指定者:
      addAll 在接口 Set<E>
      重写:
      addAll 在类 AbstractCollection<E>
      参数:
      c - 包含要添加到此集合的元素的集合
      返回:
      true 如果此集合因调用而更改
      抛出:
      NullPointerException - 如果指定的集合为空
      参见:
    • removeAll

      public boolean removeAll(Collection <?> c)
      从此集合中移除指定集合中包含的所有元素。如果指定的集合也是一个集合,则此操作有效地修改了这个集合,使其值为不对称集差两组中的。
      指定者:
      removeAll 在接口 Collection<E>
      指定者:
      removeAll 在接口 Set<E>
      重写:
      removeAll 在类 AbstractSet<E>
      参数:
      c - 包含要从此集合中删除的元素的集合
      返回:
      true 如果此集合因调用而更改
      抛出:
      ClassCastException - 如果此集合的元素类与指定集合不兼容 (optional)
      NullPointerException - 如果此集合包含空元素并且指定的集合不允许空元素 (optional),或者如果指定的集合为空
      参见:
    • retainAll

      public boolean retainAll(Collection <?> c)
      仅保留此集合中包含在指定集合中的元素。换句话说,从该集合中移除所有未包含在指定集合中的元素。如果指定的集合也是一个集合,则此操作有效地修改了这个集合,使其值为intersection两组中的。
      指定者:
      retainAll 在接口 Collection<E>
      指定者:
      retainAll 在接口 Set<E>
      重写:
      retainAll 在类 AbstractCollection<E>
      参数:
      c - 包含要保留在此集合中的元素的集合
      返回:
      true 如果此集合因调用而更改
      抛出:
      ClassCastException - 如果此集合的元素类与指定集合不兼容 (optional)
      NullPointerException - 如果此集合包含空元素并且指定的集合不允许空元素 (optional),或者如果指定的集合为空
      参见:
    • iterator

      public Iterator <E > iterator()
      按照添加这些元素的顺序返回此集合中包含的元素的迭代器。

      返回的迭代器提供了构造迭代器时集合状态的快照。遍历迭代器时不需要同步。迭代器确实 NOT 支持 remove 方法。

      指定者:
      iterator 在接口 Collection<E>
      指定者:
      iterator 在接口 Iterable<E>
      指定者:
      iterator 在接口 Set<E>
      指定者:
      iterator 在类 AbstractCollection<E>
      返回:
      此集合中元素的迭代器
    • equals

      public boolean equals(Object  o)
      比较指定对象与此集合是否相等。如果指定对象与此对象是同一对象,或者如果它也是一个 Set 并且 iterator 在指定集合上返回的元素与迭代器在该集合上返回的元素相同,则返回 true。更正式地说,如果两个迭代器返回相同数量的元素,则认为这两个迭代器返回相同的元素,并且对于迭代器在指定集合上返回的每个元素 e1,迭代器在该集合上返回一个元素 e2 使得 Objects.equals(e1, e2) .
      指定者:
      equals 在接口 Collection<E>
      指定者:
      equals 在接口 Set<E>
      重写:
      equals 在类 AbstractSet<E>
      参数:
      o - 要与此集合进行相等比较的对象
      返回:
      true如果指定的对象等于这个集合
      参见:
    • removeIf

      public boolean removeIf(Predicate <? super E > filter)
      从接口 Collection 复制的描述
      移除此集合中满足给定谓词的所有元素。迭代期间或由谓词抛出的错误或运行时异常将传递给调用者。
      指定者:
      removeIf 在接口 Collection<E>
      参数:
      filter - 为要删除的元素返回 true 的谓词
      返回:
      true 如果删除了任何元素
      抛出:
      NullPointerException - 如果指定的过滤器为空
    • forEach

      public void forEach(Consumer <? super E > action)
      从接口 Iterable 复制的描述
      Iterable 的每个元素执行给定的操作,直到处理完所有元素或操作引发异常。如果指定了迭代顺序,则将按迭代顺序执行操作。操作抛出的异常被转发给调用者。

      如果操作执行修改元素的底层源的副作用,则此方法的行为是未指定的,除非重写类已指定并发修改策略。

      指定者:
      forEach 在接口 Iterable<E>
      参数:
      action - 对每个元素执行的操作
      抛出:
      NullPointerException - 如果指定的操作为空
    • spliterator

      public Spliterator <E > spliterator()
      按照添加这些元素的顺序在此集合中的元素上返回 Spliterator

      Spliterator 报告 Spliterator.IMMUTABLE Spliterator.DISTINCT Spliterator.SIZED Spliterator.SUBSIZED

      拆分器在构建拆分器时提供集合状态的快照。在分离器上运行时不需要同步。

      指定者:
      spliterator 在接口 Collection<E>
      指定者:
      spliterator 在接口 Iterable<E>
      指定者:
      spliterator 在接口 Set<E>
      返回:
      a Spliterator 覆盖此集合中的元素
      自从:
      1.8