- 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
进行所有操作。 因此,它具有相同的基本属性:- 它最适合于设置大小通常很小的应用程序,只读操作数量远远超过可变操作,并且您需要在遍历期间防止线程之间的干扰。
- 它是线程安全的。
- 可变操作(
add
,set
,remove
,等)是昂贵的,因为它们通常意味着复制整个底层数组。 - 迭代器不支持
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
- 另请参见:
-
CopyOnWriteArrayList
, Serialized Form
-
-
构造方法摘要
构造方法 构造器 描述 CopyOnWriteArraySet()
创建一个空集。CopyOnWriteArraySet(Collection<? extends E> c)
创建一个包含指定集合的所有元素的集合。
-
方法摘要
所有方法 实例方法 具体的方法 变量和类型 方法 描述 boolean
add(E e)
如果指定的元素尚不存在,则将其添加到此集合中。boolean
addAll(Collection<? extends E> c)
如果指定集合中的所有元素尚未存在,则将其添加到此集合中。void
clear()
从该集中删除所有元素。boolean
contains(Object o)
如果此set包含指定的元素,则返回true
。boolean
containsAll(Collection<?> c)
如果此set包含指定collection的所有元素,则返回true
。boolean
equals(Object o)
将指定对象与此set进行相等性比较。void
forEach(Consumer<? super E> action)
对Iterable
每个元素执行给定操作,直到处理Iterable
所有元素或操作引发异常。boolean
isEmpty()
如果此集合不包含任何元素,则返回true
。Iterator<E>
iterator()
按照添加这些元素的顺序返回此集合中包含的元素的迭代器。boolean
remove(Object o)
如果存在,则从该集合中移除指定的元素。boolean
removeAll(Collection<?> c)
从此集合中删除指定集合中包含的所有元素。boolean
removeIf(Predicate<? super E> filter)
删除此集合中满足给定谓词的所有元素。boolean
retainAll(Collection<?> c)
仅保留此集合中包含在指定集合中的元素。int
size()
返回此集合中的元素数。Spliterator<E>
spliterator()
按照添加这些元素的顺序,在此集合中的元素上返回Spliterator
。Object[]
toArray()
返回包含此set中所有元素的数组。<T> T[]
toArray(T[] a)
返回一个包含此set中所有元素的数组; 返回数组的运行时类型是指定数组的运行时类型。-
声明方法的类 java.util.AbstractSet
hashCode
-
声明方法的类 java.util.AbstractCollection
toString
-
声明方法的接口 java.util.Collection
parallelStream, stream, toArray
-
-
-
-
构造方法详细信息
-
CopyOnWriteArraySet
public CopyOnWriteArraySet()
创建一个空集。
-
CopyOnWriteArraySet
public CopyOnWriteArraySet(Collection<? extends E> c)
创建一个包含指定集合的所有元素的集合。- 参数
-
c
- 最初包含的元素集合 - 异常
-
NullPointerException
- 如果指定的集合为null
-
-
方法详细信息
-
size
public int size()
返回此集合中的元素数。
-
isEmpty
public boolean isEmpty()
如果此集合不包含任何元素,则返回true
。- Specified by:
-
isEmpty
在界面Collection<E>
- Specified by:
-
isEmpty
在界面Set<E>
- 重写:
-
isEmpty
类AbstractCollection<E>
- 结果
-
true
如果此集合不包含任何元素
-
contains
public boolean contains(Object o)
如果此set包含指定的元素,则返回true
。 更正式的,返回true
当且仅当此集包含元素e
Objects.equals(o, e)
。- Specified by:
-
contains
在界面Collection<E>
- Specified by:
-
contains
,界面Set<E>
- 重写:
-
contains
在AbstractCollection<E>
类 - 参数
-
o
- 要测试其在此集合中的存在的元素 - 结果
-
true
如果此set包含指定的元素
-
toArray
public Object[] toArray()
返回包含此set中所有元素的数组。 如果此set对其迭代器返回的元素的顺序做出任何保证,则此方法必须以相同的顺序返回元素。返回的数组将是“安全的”,因为该集合不维护对它的引用。 (换句话说,即使此数组由数组支持,此方法也必须分配一个新数组)。 因此调用者可以自由修改返回的数组。
此方法充当基于阵列和基于集合的API之间的桥梁。
- Specified by:
-
toArray
接口Collection<E>
- Specified by:
-
toArray
在界面Set<E>
- 重写:
-
toArray
类AbstractCollection<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>
- 重写:
-
toArray
在AbstractCollection<E>
类 - 参数类型
-
T
- 要包含集合的数组的组件类型 - 参数
-
a
- 要存储此集合的元素的数组(如果它足够大); 否则,为此目的分配相同运行时类型的新数组。 - 结果
- 包含此集合中所有元素的数组
- 异常
-
ArrayStoreException
- 如果指定数组的运行时类型不是此集合中每个元素的运行时类型的超类型 -
NullPointerException
- 如果指定的数组为null
-
clear
public void clear()
从该集中删除所有元素。 此调用返回后,该集将为空。- Specified by:
-
clear
,界面Collection<E>
- Specified by:
-
clear
在界面Set<E>
- 重写:
-
clear
在类AbstractCollection<E>
-
remove
public boolean remove(Object o)
如果存在,则从该集合中移除指定的元素。 更正式地,删除元素e
,使得Objects.equals(o, e)
,如果此集合包含这样的元素。 如果此集合包含元素,则返回true
(或等效地,如果此集合因调用而更改)。 (一旦调用返回,该集合将不包含该元素。)- Specified by:
-
remove
在界面Collection<E>
- Specified by:
-
remove
,界面Set<E>
- 重写:
-
remove
类AbstractCollection<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>
- 重写:
-
add
在AbstractCollection<E>
类 - 参数
-
e
- 要添加到此集合的元素 - 结果
-
true
如果此集合尚未包含指定的元素
-
containsAll
public boolean containsAll(Collection<?> c)
如果此集合包含指定集合的所有元素,则返回true
。 如果指定的集合也是集合,则此方法返回true
如果它是此集合的子集)。- Specified by:
-
containsAll
,界面Collection<E>
- Specified by:
-
containsAll
在界面Set<E>
- 重写:
-
containsAll
类AbstractCollection<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>
- 重写:
-
addAll
在AbstractCollection<E>
类 - 参数
-
c
- 包含要添加到此集合的元素的集合 - 结果
-
true
如果此设置因呼叫而更改 - 异常
-
NullPointerException
- 如果指定的集合为null - 另请参见:
-
add(Object)
-
removeAll
public boolean removeAll(Collection<?> c)
从此集合中删除指定集合中包含的所有元素。 如果指定的集合也是一个集合,则此操作会有效地修改此集合,以使其值为两个集合的不对称集合差异 。- Specified by:
-
removeAll
,界面Collection<E>
- Specified by:
-
removeAll
在接口Set<E>
- 重写:
-
removeAll
类AbstractSet<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>
- 重写:
-
retainAll
类AbstractCollection<E>
- 参数
-
c
- 包含要在此集中保留的元素的集合 - 结果
-
true
如果此设置因呼叫而更改 - 异常
-
ClassCastException
- 如果此集合的元素的类与指定的集合不兼容( optional ) -
NullPointerException
- 如果此set包含null元素且指定的collection不允许null元素( optional ),或者指定的collection是null - 另请参见:
-
remove(Object)
-
iterator
public Iterator<E> iterator()
按照添加这些元素的顺序返回此集合中包含的元素的迭代器。返回的迭代器提供构造迭代器时集的状态的快照。 遍历迭代器时不需要同步。 该迭代器不支持
remove
方法。
-
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>
- 重写:
-
equals
在AbstractSet<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
-
spliterator
public Spliterator<E> spliterator()
按照添加这些元素的顺序,在此集合中的元素上返回Spliterator
。该
Spliterator
报告Spliterator.IMMUTABLE
,Spliterator.DISTINCT
,Spliterator.SIZED
和Spliterator.SUBSIZED
。分裂器提供了构造分裂器时集合状态的快照。 在分离器上操作时不需要同步。
- Specified by:
-
spliterator
,界面Collection<E>
- Specified by:
-
spliterator
,界面Iterable<E>
- Specified by:
-
spliterator
接口Set<E>
- 结果
-
a
Spliterator
覆盖了此集合中的元素 - 从以下版本开始:
- 1.8
-
-