Module java.base

Class 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
使用内部CopyOnWriteArrayList执行所有操作的Set。因此,它具有相同的基本属性:
  • 最适合于集合大小通常保持较小,只读操作远远超过改变操作,并且需要在遍历期间防止线程之间的干扰的应用程序。
  • 它是线程安全的。
  • 改变操作(addsetremove等)很昂贵,因为它们通常涉及复制整个基础数组。
  • 迭代器不支持改变性的remove操作。
  • 通过迭代器进行遍历快速且不会受到其他线程的干扰。迭代器依赖于在构造迭代器时数组的不变快照。

示例用法。 以下代码草图使用复制写入集合来维护执行某些操作的Handler对象集合的状态更新。

 
 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集合框架的成员。

自 JDK 版本:
1.5
参见:
  • Constructor Summary

    Constructors
    Constructor
    Description
    创建一个空集合。
    创建一个包含指定集合中所有元素的集合。
  • Method Summary

    Modifier and Type
    Method
    Description
    boolean
    add(E e)
    如果此集合中尚未包含指定元素,则将其添加到此集合中。
    boolean
    addAll(Collection<? extends E> c)
    如果此集合中尚未包含指定集合中的所有元素,则将它们全部添加到此集合中。
    void
    clear()
    从此集合中移除所有元素。
    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
    Object[]
    返回包含此集合中所有元素的数组。
    <T> T[]
    toArray(T[] a)
    返回包含此集合中所有元素的数组;返回数组的运行时类型与指定数组的类型相同。

    Methods declared in class java.util.AbstractSet

    hashCode

    Methods declared in class java.util.AbstractCollection

    toString

    Methods declared in class java.lang.Object

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

    Methods declared in interface java.util.Collection

    parallelStream, stream, toArray
  • Constructor Details

    • CopyOnWriteArraySet

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

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

    • 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。更正式地说,如果此集合包含使Objects.equals(o, e)true的元素e,则返回true
      指定者:
      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 - 如果指定数组为null
    • 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 - 如果指定的集合为null
      参见:
    • addAll

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

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

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

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

      返回的迭代器提供了在构造迭代器时集合状态的快照。在遍历迭代器时不需要同步。迭代器不支持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 - 如果指定的过滤器为null
    • forEach

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

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

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

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

      Spliterator报告Spliterator.IMMUTABLESpliterator.DISTINCTSpliterator.SIZEDSpliterator.SUBSIZED

      Spliterator提供了在构造spliterator时集合状态的快照。在操作spliterator时不需要同步。

      指定者:
      spliterator 在接口 Collection<E>
      指定者:
      spliterator 在接口 Iterable<E>
      指定者:
      spliterator 在接口 Set<E>
      返回:
      该集合中元素的Spliterator
      自版本:
      1.8