Класс 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
- См. также:
Краткое описание конструкторов
| Конструктор | Описание |
|---|---|
CopyOnWriteArraySet() |
Создает пустое множество. |
CopyOnWriteArraySet |
Создает множество, содержащее все элементы указанной коллекции. |
Краткое описание методов
| Модификатор и тип | Метод | Описание |
|---|---|---|
boolean |
add |
Добавляет указанный элемент в это множество, если он еще не присутствует. |
boolean |
addAll |
Добавляет в это множество все элементы указанной коллекции, которых в нем еще нет. |
void |
clear() |
Удаляет все элементы из этого множества. |
boolean |
contains |
Возвращает true, если это множество содержит указанный элемент. |
boolean |
containsAll |
Возвращает true, если это множество содержит все элементы указанной коллекции. |
boolean |
equals |
Сравнивает указанный объект с этим множеством на равенство. |
void |
forEach |
Выполняет заданное действие для каждого элемента Iterable, пока не будут обработаны все элементы или действие не вызовет исключение. |
boolean |
isEmpty() |
Возвращает true, если это множество не содержит элементов. |
Iterator |
iterator() |
Возвращает итератор по элементам этого множества в порядке их добавления. |
boolean |
remove |
Удаляет указанный элемент из этого множества, если он присутствует. |
boolean |
removeAll |
Удаляет из этого множества все элементы, содержащиеся в указанной коллекции. |
boolean |
removeIf |
Удаляет из этой коллекции все элементы, удовлетворяющие заданному предикату (необязательная операция). |
boolean |
retainAll |
Оставляет в этом множестве только элементы, содержащиеся в указанной коллекции. |
int |
size() |
Возвращает количество элементов в этом множестве. |
Spliterator |
spliterator() |
Возвращает Spliterator по элементам этого множества в порядке их добавления. |
Object[] |
toArray() |
Возвращает массив, содержащий все элементы этого множества. |
<T> T[] |
toArray |
Возвращает массив, содержащий все элементы этого множества; тип возвращаемого массива во время выполнения совпадает с типом указанного массива. |
Методы, объявленные в классе AbstractSet
hashCode
Методы, объявленные в классе AbstractCollection
toString
Методы, объявленные в интерфейсе Collection
parallelStream, stream, toArray
Подробное описание конструкторов
CopyOnWriteArraySet
public CopyOnWriteArraySet()
CopyOnWriteArraySet
public CopyOnWriteArraySet(Collection<? extends E> c)
- Параметры:
-
c— коллекция элементов, которые должны изначально содержаться в множестве - Исключения:
-
NullPointerException— если указанная коллекция равна null
Подробное описание методов
size
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 на основе массивов и API на основе коллекций.
- Указан в:
-
toArrayв интерфейсеCollection<E> - Указан в:
-
toArrayв интерфейсеSet<E> - Переопределяет:
-
toArrayв классеAbstractCollection<E> - Возвращает:
- массив, содержащий все элементы этого множества
toArray
public <T> T[] toArray(T[] a)
Если множество помещается в указанный массив с запасом (то есть в массиве больше элементов, чем в этом множестве), элемент массива, расположенный непосредственно после конца множества, устанавливается в значение null. (Это полезно для определения длины этого множества только в том случае, если вызывающий код знает, что оно не содержит элементов null.)
Если это множество гарантирует определенный порядок возврата элементов итератором, данный метод должен возвращать элементы в том же порядке.
Как и метод toArray(), этот метод служит связующим звеном между API на основе массивов и 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)
e в это множество, если множество не содержит элемента e2, для которого выполняется Objects.equals(e, e2). Если множество уже содержит этот элемент, вызов не изменяет множество и возвращает 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, а указанная коллекция не допускает элементы null (необязательно), или если указанная коллекция равна null - См. также:
retainAll
public boolean retainAll(Collection<?> c)
- Указан в:
-
retainAllв интерфейсеCollection<E> - Указан в:
-
retainAllв интерфейсеSet<E> - Переопределяет:
-
retainAllв классеAbstractCollection<E> - Параметры:
-
c— коллекция, содержащая элементы, которые нужно оставить в этом множестве - Возвращает:
-
true, если в результате вызова это множество изменилось - Исключения:
-
ClassCastException— если класс элемента этого множества несовместим с указанной коллекцией (необязательно) -
NullPointerException— если это множество содержит элемент null, а указанная коллекция не допускает элементы null (необязательно), или если указанная коллекция равна null - См. также:
iterator
public Iterator<E> iterator()
Возвращаемый итератор предоставляет снимок состояния множества на момент создания итератора. При обходе итератора синхронизация не требуется. Итератор НЕ поддерживает метод remove.
equals
public boolean equals(Object o)
true, если указанный объект является тем же объектом, что и этот объект, или если он также является Set, а элементы, возвращаемые итератором по указанному множеству, совпадают с элементами, возвращаемыми итератором по этому множеству. Точнее, считается, что два итератора возвращают одинаковые элементы, если они возвращают одинаковое количество элементов и для каждого элемента 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)
IterableIterable, пока не будут обработаны все элементы или действие не вызовет исключение. Если порядок итерации определен, действия выполняются в этом порядке. Исключения, вызванные действием, передаются вызывающему коду. Поведение этого метода не определено, если действие выполняет побочные эффекты, изменяющие базовый источник элементов, за исключением случаев, когда переопределяющий класс определяет политику конкурентной модификации.
- Указан в:
-
forEachв интерфейсеIterable<E> - Параметры:
-
action— действие, выполняемое для каждого элемента - Исключения:
-
NullPointerException— если указанное действие равно null
spliterator
public Spliterator<E> spliterator()
Spliterator по элементам этого множества в порядке их добавления. Объект Spliterator сообщает о характеристиках Spliterator.IMMUTABLE, Spliterator.DISTINCT, Spliterator.SIZED и Spliterator.SUBSIZED.
Сплитератор предоставляет снимок состояния множества на момент его создания. При работе со сплитератором синхронизация не требуется.
- Указан в:
-
spliteratorв интерфейсеCollection<E> - Указан в:
-
spliteratorв интерфейсеIterable<E> - Указан в:
-
spliteratorв интерфейсеSet<E> - Возвращает:
Spliteratorпо элементам этого множества- Начиная с версии:
- 1.8
© 1993, 2025, Oracle and/or its affiliates. All rights reserved.
Documentation extracted from Debian's OpenJDK Development Kit package.
Licensed under the GNU General Public License, version 2, with the Classpath Exception.
Various third party code in OpenJDK is licensed under different licenses (see Debian package).
Java and OpenJDK are trademarks or registered trademarks of Oracle and/or its affiliates.
https://docs.oracle.com/en/java/javase/25/docs/api/java.base/java/util/concurrent/CopyOnWriteArraySet.html