模块  java.base
软件包  java.util.concurrent

Class CopyOnWriteArraySet<E>

  • 参数类型
    E - 此集合中包含的元素类型
    实现的所有接口
    SerializableIterable<E>Collection<E>Set<E>

    public class CopyOnWriteArraySet<E>extends AbstractSet<E>implements Serializable
    Set ,它使用内部CopyOnWriteArrayList进行所有操作。 因此,它具有相同的基本属性:
    • 它最适合于设置大小通常很小的应用程序,只读操作数量远远超过可变操作,并且您需要在遍历期间防止线程之间的干扰。
    • 它是线程安全的。
    • 可变操作( 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 Collections Framework的成员。

    从以下版本开始:
    1.5
    另请参见:
    CopyOnWriteArrayListSerialized Form
    • 构造方法详细信息

      • CopyOnWriteArraySet

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

        public CopyOnWriteArraySet​(Collection<? extends E> c)
        创建一个包含指定集合的所有元素的集合。
        参数
        c - 最初包含的元素集合
        异常
        NullPointerException - 如果指定的集合为null
    • 方法详细信息

      • size

        public int size()
        返回此集合中的元素数。
        Specified by:
        size在界面 Collection<E>
        Specified by:
        size在界面 Set<E>
        结果
        此集合中的元素数量
      • contains

        public boolean contains​(Object o)
        如果此set包含指定的元素,则返回true 更正式的,返回true当且仅当此集包含元素e Objects.equals(o, e)
        Specified by:
        contains在界面 Collection<E>
        Specified by:
        contains ,界面 Set<E>
        重写:
        containsAbstractCollection<E>
        参数
        o - 要测试其在此集合中的存在的元素
        结果
        true如果此set包含指定的元素
      • toArray

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

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

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

        Specified by:
        toArray接口 Collection<E>
        Specified by:
        toArray在界面 Set<E>
        重写:
        toArrayAbstractCollection<E>
        结果
        包含此集合中所有元素的数组
      • toArray

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

        如果此集合适合指定的数组,并且有空余空间(即,数组的元素数多于此集合),则紧跟集合结尾的数组中的元素将设置为null 当调用者知道此集合不包含任何null元素时,这在确定此集合的长度时很有用。)

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

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

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

          String[] y = x.toArray(new String[0]); 
        请注意, toArray(new Object[0])功能与toArray()相同。
        Specified by:
        toArray在界面 Collection<E>
        Specified by:
        toArray在界面 Set<E>
        重写:
        toArrayAbstractCollection<E>
        参数类型
        T - 要包含集合的数组的组件类型
        参数
        a - 要存储此集合的元素的数组(如果它足够大); 否则,为此目的分配相同运行时类型的新数组。
        结果
        包含此集合中所有元素的数组
        异常
        ArrayStoreException - 如果指定数组的运行时类型不是此集合中每个元素的运行时类型的超类型
        NullPointerException - 如果指定的数组为null
      • remove

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

        public boolean add​(E e)
        如果指定的元素尚不存在,则将其添加到此集合中。 更正式地,将指定的元素e这一套如果集合不包含元素e2使得Objects.equals(e, e2) 如果此set已包含该元素,则调用将保持set不变并返回false
        Specified by:
        add在界面 Collection<E>
        Specified by:
        add在界面 Set<E>
        重写:
        addAbstractCollection<E>
        参数
        e - 要添加到此集合的元素
        结果
        true如果此集合尚未包含指定的元素
      • containsAll

        public boolean containsAll​(Collection<?> c)
        如果此集合包含指定集合的所有元素,则返回true 如果指定的集合也是集合,则此方法返回true如果它是此集合的集)。
        Specified by:
        containsAll ,界面 Collection<E>
        Specified by:
        containsAll在界面 Set<E>
        重写:
        containsAllAbstractCollection<E>
        参数
        c - 要检查此集合中的包含的集合
        结果
        true如果此集包含指定集合的所有元素
        异常
        NullPointerException - 如果指定的集合为null
        另请参见:
        contains(Object)
      • addAll

        public boolean addAll​(Collection<? extends E> c)
        如果指定集合中的所有元素尚未存在,则将其添加到此集合中。 如果指定的集合也是集合,则addAll操作会有效地修改此集合,以使其值为两个集合的集。 如果在操作正在进行时修改了指定的集合,则此操作的行为是不确定的。
        Specified by:
        addAll ,界面 Collection<E>
        Specified by:
        addAll ,界面 Set<E>
        重写:
        addAllAbstractCollection<E>
        参数
        c - 包含要添加到此集合的元素的集合
        结果
        true如果此设置因呼叫而更改
        异常
        NullPointerException - 如果指定的集合为null
        另请参见:
        add(Object)
      • removeAll

        public boolean removeAll​(Collection<?> c)
        从此集合中删除指定集合中包含的所有元素。 如果指定的集合也是一个集合,则此操作会有效地修改此集合,以使其值为两个集合的不对称集合差异
        Specified by:
        removeAll ,界面 Collection<E>
        Specified by:
        removeAll在接口 Set<E>
        重写:
        removeAllAbstractSet<E>
        参数
        c - 包含要从此集中删除的元素的集合
        结果
        true如果此设置因呼叫而更改
        异常
        ClassCastException - 如果此集合的元素的类与指定的集合不兼容( optional
        NullPointerException - 如果此set包含null元素且指定的collection不允许null元素( optional ),或者指定的collection是null
        另请参见:
        remove(Object)
      • retainAll

        public boolean retainAll​(Collection<?> c)
        仅保留此集合中包含在指定集合中的元素。 换句话说,从该集合中删除未包含在指定集合中的所有元素。 如果指定的集合也是一个集合,则此操作会有效地修改此集合,使其值为两个集合的交集
        Specified by:
        retainAll接口 Collection<E>
        Specified by:
        retainAll ,界面 Set<E>
        重写:
        retainAllAbstractCollection<E>
        参数
        c - 包含要在此集中保留的元素的集合
        结果
        true如果此设置因呼叫而更改
        异常
        ClassCastException - 如果此集合的元素的类与指定的集合不兼容( optional
        NullPointerException - 如果此set包含null元素且指定的collection不允许null元素( optional ),或者指定的collection是null
        另请参见:
        remove(Object)
      • iterator

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

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

        Specified by:
        iterator ,界面 Collection<E>
        Specified by:
        iterator ,界面 Iterable<E>
        Specified by:
        iterator在界面 Set<E>
        Specified by:
        iteratorAbstractCollection<E>
        结果
        这个集合中元素的迭代器
      • equals

        public boolean equals​(Object o)
        将指定对象与此set进行相等性比较。 返回true如果指定对象是相同的对象,因为这对象,或者如果它是一个也Set ,并通过返回的元件iterator在指定的一组中的相同通过在该组的迭代器返回的元素。 更正式地说,两个迭代器被认为返回相同的元素,如果它们返回相同数量的元素,并且对于迭代器在指定集上返回的每个元素e1 ,迭代器在此集合上返回一个元素e2 ,使得Objects.equals(e1, e2)
        Specified by:
        equals ,界面 Collection<E>
        Specified by:
        equals在接口 Set<E>
        重写:
        equalsAbstractSet<E>
        参数
        o - 要与此集进行相等性比较的对象
        结果
        true如果指定的对象等于此set
        另请参见:
        Object.hashCode()HashMap
      • removeIf

        public boolean removeIf​(Predicate<? super E> filter)
        从界面复制的说明: Collection
        删除此集合中满足给定谓词的所有元素。 在迭代期间或通过谓词抛出的错误或运行时异常被中继到调用者。
        Specified by:
        removeIf在接口 Collection<E>
        参数
        filter - 一个谓词,它返回 true表示要删除的元素
        结果
        true如果删除了任何元素
        异常
        NullPointerException - 如果指定的过滤器为null
      • forEach

        public void forEach​(Consumer<? super E> action)
        从界面复制的说明: Iterable
        Iterable每个元素执行给定操作,直到处理Iterable所有元素或操作抛出异常为止。 如果指定了该顺序,则按迭代顺序执行操作。 操作抛出的异常将转发给调用者。

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

        Specified by:
        forEach在界面 Iterable<E>
        参数
        action - 要为每个元素执行的操作
        异常
        NullPointerException - 如果指定的操作为null