Класс CopyOnWriteArraySet<E>

Type Parameters:
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, Сериализованная форма

Конструкторы

Конструктор Описание
CopyOnWriteArraySet()

Создаёт пустой набор.

CopyOnWriteArraySet​(Collection<? extends E> c)

Создаёт набор, содержащий все элементы указанной коллекции.

Методы

Модификатор и тип Метод Описание
boolean add​(E e)

Добавляет указанный элемент в этот набор, если он ещё не присутствует.

boolean addAll​(Collection<? extends E> c)

Добавляет все элементы из указанной коллекции в этот набор, если они ещё не присутствуют.

void clear()

Удаляет все элементы из этого набора.

boolean contains​(Object o)

Возвращает true, если этот набор содержит указанный элемент.

boolean containsAll​(Collection<?> c)

Возвращает true, если этот набор содержит все элементы указанной коллекции.

boolean equals​(Object o)

Сравнивает указанный объект с этим набором на равенство.

void forEach​(Consumer<? super E> action)

Выполняет заданное действие для каждого элемента 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()

Возвращает массив, содержащий все элементы в этом наборе.

<T> T[] toArray​(T[] a)

Возвращает массив, содержащий все элементы в этом наборе; тип времени выполнения возвращаемого массива — тот, что указан в массиве.

Методы, объявленные в классе java.util.AbstractSet

hashCode

Методы, объявленные в классе java.util.AbstractCollection

toString

Методы, объявленные в классе java.lang.Object

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

Методы, объявленные в интерфейсе java.util.Collection

parallelStream, stream, toArray

Подробное описание конструкторов

CopyOnWriteArraySet

public CopyOnWriteArraySet()

Создаёт пустой набор.

CopyOnWriteArraySet

public CopyOnWriteArraySet(Collection<? extends E> c)

Создаёт набор, содержащий все элементы указанной коллекции.

Параметры:
c - коллекция элементов, которые должны первоначально содержаться
Исключения:
NullPointerException - если указанная коллекция равна null

Методы

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, если этот набор содержит указанный элемент. Более формально, возвращает true, если и только если этот набор содержит элемент e, такой что Objects.equals(o, e).

Указано в:
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)

Добавляет указанный элемент в этот набор, если он ещё не присутствует. Более формально, добавляет указанный элемент 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
См. также:
contains(Object)

addAll

public boolean addAll(Collection<? extends E> c)

Добавляет все элементы в указанной коллекции в этот набор, если они ещё не присутствуют. Если указанная коллекция также является набором, операция addAll эффективно изменяет этот набор так, что его значение является *объединением* двух наборов. Поведение этой операции не определено, если указанная коллекция изменяется во время выполнения операции.

Указано в:
addAll в интерфейсе Collection<E>
Указано в:
addAll в интерфейсе Set<E>
Переопределяет:
addAll в классе AbstractCollection<E>
Параметры:
c - коллекция, содержащая элементы, которые нужно добавить в этот набор
Возвращает:
true если этот набор изменился в результате вызова
Исключения:
NullPointerException - если указанная коллекция равна null
См. также:
add(Object)

removeAll

public boolean removeAll(Collection<?> c)

Удаляет из этого набора все его элементы, которые содержатся в указанной коллекции. Если указанная коллекция также является набором, эта операция эффективно изменяет этот набор так, что его значение является *асимметричной разностью* двух наборов.

Указано в:
removeAll в интерфейсе Collection<E>
Указано в:
removeAll в интерфейсе Set<E>
Переопределяет:
removeAll в классе AbstractSet<E>
Параметры:
c - коллекция, содержащая элементы, которые нужно удалить из этого набора
Возвращает:
true если этот набор изменился в результате вызова
Исключения:
ClassCastException - если класс элемента этого набора несовместим с указанной коллекцией (необязательно)
NullPointerException - если этот набор содержит пустой элемент, а указанная коллекция не допускает пустых элементов (необязательно), или если указанная коллекция равна null
См. также:
remove(Object)

retainAll

public boolean retainAll(Collection<?> c)

Оставляет только элементы в этом наборе, которые содержатся в указанной коллекции. Другими словами, удаляет из этого набора все его элементы, которые не содержатся в указанной коллекции. Если указанная коллекция также является набором, эта операция эффективно изменяет этот набор так, что его значение является *пересечением* двух наборов.

Указано в:
retainAll в интерфейсе Collection<E>
Указано в:
retainAll в интерфейсе Set<E>
Переопределяет:
retainAll в классе AbstractCollection<E>
Параметры:
c — коллекция, содержащая элементы, которые необходимо сохранить в этом наборе
Возвращает:
true , если этот набор был изменён в результате вызова
Выбрасывает:
ClassCastException — если класс элемента этого набора несовместим с указанной коллекцией (необязательно)
NullPointerException — если этот набор содержит нулевой элемент, а указанная коллекция не допускает нулевые элементы (необязательно), или если указанная коллекция равна null
См. также:
remove(Object)

iterator

public Iterator<E> iterator()

Возвращает итератор по элементам, содержащимся в этом наборе в порядке их добавления.

Возвращённый итератор предоставляет моментальный снимок состояния набора на момент создания итератора. Не требуется синхронизация при прохождении итератора. Итератор НЕ поддерживает метод remove.

Указано в:
iterator в интерфейсе Collection<E>
Указано в:
iterator в интерфейсе Iterable<E>
Указано в:
iterator в интерфейсе Set<E>
Указано в:
iterator в классе AbstractCollection<E>
Возвращает:
итератор по элементам в этом наборе

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 , если указанный объект равен этому набору
См. также:
Object.hashCode(), HashMap

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.IMMUTABLE, Spliterator.DISTINCT, Spliterator.SIZED и Spliterator.SUBSIZED.

Итератор предоставляет моментальный снимок состояния набора на момент создания итератора. При работе с итератором не требуется синхронизация.

Указано в:
spliterator в интерфейсе Collection<E>
Указано в:
spliterator в интерфейсе Iterable<E>
Указано в:
spliterator в интерфейсе Set<E>
Возвращает:
Spliterator по элементам в этом наборе
С:
1.8

© 1993, 2020, 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/11/docs/api/java.base/java/util/concurrent/CopyOnWriteArraySet.html

Spec-Zone .ru
спецификации, руководства, описания, API