java.lang.Object
java.util.AbstractCollection<E>
java.util.AbstractSet<E>
java.util.concurrent.CopyOnWriteArraySet<E>
- 类型参数:
-
E
- 此集合中保存的元素的类型
- 所有实现的接口:
-
Serializable
,Iterable<E>
,Collection<E>
,Set<E>
使用内部
CopyOnWriteArrayList
执行所有操作的Set
。因此,它具有相同的基本属性:
- 最适合于集合大小通常保持较小,只读操作远远超过改变操作,并且需要在遍历期间防止线程之间的干扰的应用程序。
- 它是线程安全的。
- 改变操作(
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集合框架的成员。
- 自 JDK 版本:
- 1.5
- 参见:
-
Constructor Summary
-
Method Summary
Modifier and TypeMethodDescriptionboolean
如果此集合中尚未包含指定元素,则将其添加到此集合中。boolean
addAll
(Collection<? extends E> c) 如果此集合中尚未包含指定集合中的所有元素,则将它们全部添加到此集合中。void
clear()
从此集合中移除所有元素。boolean
如果此集合包含指定元素,则返回true
。boolean
containsAll
(Collection<?> c) 如果此集合包含指定集合中的所有元素,则返回true
。boolean
将指定对象与此集合进行比较以检查相等性。void
对Iterable
的每个元素执行给定操作,直到所有元素都已处理完毕或操作引发异常。boolean
isEmpty()
如果此集合不包含任何元素,则返回true
。iterator()
返回此集合中包含的元素的迭代器,按照这些元素添加的顺序。boolean
如果存在,则从此集合中移除指定元素。boolean
removeAll
(Collection<?> c) 从此集合中移除包含在指定集合中的所有元素。boolean
移除此集合中满足给定谓词的所有元素。boolean
retainAll
(Collection<?> c) 仅保留此集合中包含在指定集合中的元素。int
size()
返回此集合中的元素数量。返回按照这些元素添加的顺序在此集合中的元素上的Spliterator
。Object[]
toArray()
返回包含此集合中所有元素的数组。<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
创建一个包含指定集合中所有元素的集合。- 参数:
-
c
- 最初包含元素的集合 - 抛出:
-
NullPointerException
- 如果指定的集合为 null
-
-
Method Details
-
size
public int size()返回此集合中的元素数量。 -
isEmpty
public boolean isEmpty()如果此集合不包含任何元素,则返回true
。- 指定者:
-
isEmpty
在接口Collection<E>
中 - 指定者:
-
isEmpty
在接口Set<E>
中 - 覆盖:
-
isEmpty
在类AbstractCollection<E>
中 - 返回:
-
如果此集合不包含任何元素,则返回
true
-
contains
如果此集合包含指定元素,则返回true
。更正式地说,如果此集合包含使Objects.equals(o, e)
为true
的元素e
,则返回true
。- 指定者:
-
contains
在接口Collection<E>
中 - 指定者:
-
contains
在接口Set<E>
中 - 覆盖:
-
contains
在类AbstractCollection<E>
中 - 参数:
-
o
- 要测试其在此集合中存在性的元素 - 返回:
-
如果此集合包含指定元素,则返回
true
-
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
如果存在,则从此集合中删除指定的元素。更正式地说,删除一个元素e
,使得Objects.equals(o, e)
,如果此集合包含这样的元素。如果此集合包含元素,则返回true
(或等效地,如果此集合由于调用而更改)。(调用返回后,此集合将不包含该元素。)- 指定由:
-
remove
在接口Collection<E>
中 - 指定由:
-
remove
在接口Set<E>
中 - 覆盖:
-
remove
在类AbstractCollection<E>
中 - 参数:
-
o
- 如果存在,则从此集合中删除的对象 - 返回:
-
如果此集合包含指定的元素,则返回
true
-
add
如果尚未存在,则将指定的元素添加到此集合。更正式地说,如果集合不包含Objects.equals(e, e2)
的元素e2
,则将指定的元素e
添加到此集合。如果此集合已包含该元素,则调用将保持集合不变并返回false
。- 指定由:
-
add
在接口Collection<E>
中 - 指定由:
-
add
在接口Set<E>
中 - 覆盖:
-
add
在类AbstractCollection<E>
中 - 参数:
-
e
- 要添加到此集合的元素 - 返回:
-
如果此集合尚未包含指定的元素,则返回
true
-
containsAll
如果此集合包含指定集合的所有元素,则返回true
。如果指定的集合也是一个集合,则此方法返回true
,如果它是此集合的子集。- 指定由:
-
containsAll
在接口Collection<E>
中 - 指定由:
-
containsAll
在接口Set<E>
中 - 覆盖:
-
containsAll
在类AbstractCollection<E>
中 - 参数:
-
c
- 要检查是否包含在此集合中的集合 - 返回:
-
如果此集合包含指定集合的所有元素,则返回
true
- 抛出:
-
NullPointerException
- 如果指定的集合为null - 参见:
-
addAll
如果尚未存在,则将指定集合中的所有元素添加到此集合。如果指定的集合也是一个集合,则addAll
操作有效地修改此集合,使其值为两个集合的并集。如果在操作进行时修改了指定的集合,则此操作的行为是未定义的。- 指定由:
-
addAll
在接口Collection<E>
中 - 指定由:
-
addAll
在接口Set<E>
中 - 覆盖:
-
addAll
在类AbstractCollection<E>
中 - 参数:
-
c
- 包含要添加到此集合中的元素的集合 - 返回:
-
如果此集合由于调用而更改,则返回
true
- 抛出:
-
NullPointerException
- 如果指定的集合为null - 参见:
-
removeAll
从此集合中删除包含在指定集合中的所有元素。如果指定的集合也是一个集合,则此操作有效地修改此集合,使其值为两个集合的非对称集差。- 指定者:
-
removeAll
在接口Collection<E>
中 - 指定者:
-
removeAll
在接口Set<E>
中 - 覆盖:
-
removeAll
在类AbstractSet<E>
中 - 参数:
-
c
- 包含要从此集合中移除的元素的集合 - 返回值:
-
true
如果此集合因调用而更改 - 抛出:
-
ClassCastException
- 如果此集合的元素的类与指定集合不兼容 (可选) -
NullPointerException
- 如果此集合包含空元素且指定集合不允许空元素 (可选), 或者指定集合为null - 参见:
-
retainAll
仅保留此集合中包含在指定集合中的元素。换句话说,从此集合中移除不包含在指定集合中的所有元素。如果指定集合也是一个集合,则此操作有效地修改此集合,使其值为两个集合的交集。- 指定者:
-
retainAll
在接口Collection<E>
中 - 指定者:
-
retainAll
在接口Set<E>
中 - 覆盖:
-
retainAll
在类AbstractCollection<E>
中 - 参数:
-
c
- 包含要在此集合中保留的元素的集合 - 返回值:
-
true
如果此集合因调用而更改 - 抛出:
-
ClassCastException
- 如果此集合的元素的类与指定集合不兼容 (可选) -
NullPointerException
- 如果此集合包含空元素且指定集合不允许空元素 (可选), 或者指定集合为null - 参见:
-
iterator
返回一个迭代器,按照添加这些元素的顺序包含在此集合中的元素。返回的迭代器提供了在构造迭代器时集合状态的快照。在遍历迭代器时不需要同步。迭代器不支持
remove
方法。 -
equals
将指定对象与此集合进行比较以确定是否相等。如果指定对象与此对象相同,或者如果它也是一个Set
,并且由指定集合上的iterator
返回的元素与由此集合上的迭代器返回的元素相同,则返回true
。更正式地说,如果两个迭代器返回相同数量的元素,并且对于指定集合上迭代器返回的每个元素e1
,存在一个由此集合上迭代器返回的元素e2
,使得Objects.equals(e1, e2)
。- 指定者:
-
equals
在接口Collection<E>
中 - 指定者:
-
equals
在接口Set<E>
中 - 覆盖:
-
equals
在类AbstractSet<E>
中 - 参数:
-
o
- 用于与此集合进行比较的对象 - 返回值:
-
true
如果指定对象等于此集合 - 参见:
-
removeIf
从接口复制的描述:Collection
移除满足给定谓词的此集合的所有元素。在迭代期间抛出的错误或运行时异常将被传递给调用者。- 指定者:
-
removeIf
在接口Collection<E>
中 - 参数:
-
filter
- 一个返回true
以便移除元素的谓词 - 返回值:
-
true
如果有任何元素被移除 - 抛出:
-
NullPointerException
- 如果指定的过滤器为null
-
forEach
从接口复制的描述:Iterable
对Iterable
的每个元素执行给定操作,直到所有元素都已处理或操作引发异常。如果指定了顺序,则按照迭代顺序执行操作。操作引发的异常将传递给调用者。如果操作执行会修改元素的底层源的副作用,则此方法的行为是未指定的,除非覆盖类已指定并发修改策略。
- 指定者:
-
forEach
在接口Iterable<E>
中 - 参数:
-
action
- 要对每个元素执行的操作 - 抛出:
-
NullPointerException
- 如果指定的操作为null
-
spliterator
返回一个按照添加这些元素的顺序包含在此集合中的元素的Spliterator
。Spliterator
报告Spliterator.IMMUTABLE
、Spliterator.DISTINCT
、Spliterator.SIZED
和Spliterator.SUBSIZED
。Spliterator
提供了在构造spliterator时集合状态的快照。在操作spliterator时不需要同步。- 指定者:
-
spliterator
在接口Collection<E>
- 指定者:
-
spliterator
在接口Iterable<E>
- 指定者:
-
spliterator
在接口Set<E>
- 返回:
-
该集合中元素的
Spliterator
- 自版本:
- 1.8
-