Класс 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.
- С момента:
- 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<E> |
iterator() |
Возвращает итератор по элементам, содержащимся в этом множестве в порядке их добавления. |
boolean |
remove |
Удаляет указанный элемент из этого множества, если он присутствует. |
boolean |
removeAll |
Удаляет из этого множества все его элементы, которые содержатся в указанной коллекции. |
boolean |
removeIf |
Удаляет все элементы этой коллекции, удовлетворяющие заданному предикату. |
boolean |
retainAll |
Оставляет только элементы в этом множестве, которые содержатся в указанной коллекции. |
int |
size() |
Возвращает количество элементов в этом множестве. |
Spliterator<E> |
spliterator() |
Возвращает Spliterator по элементам в этом множестве в порядке их добавления. |
Object[] |
toArray() |
Возвращает массив, содержащий все элементы этого множества. |
<T> T[] |
toArray |
Возвращает массив, содержащий все элементы этого множества; тип возвращаемого массива соответствует указанному массиву. |
Методы, объявленные в классе 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()
- Определено в:
-
isEmptyв интерфейсеCollection<E> - Определено в:
-
isEmptyв интерфейсеSet<E> - Переопределяет:
-
isEmptyв классеAbstractCollection<E> - Возвращает:
- true, если это множество не содержит элементов
contains
public boolean contains(Object o)
- Определено в:
-
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. (Это полезно для определения длины этого множества *только* если вызывающий метод знает, что это множество не содержит 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)
- Определено в:
-
removeв интерфейсеCollection<E> - Определено в:
-
removeв интерфейсеSet<E> - Переопределяет:
-
removeв классеAbstractCollection<E> - Параметры:
-
o- элемент, который нужно удалить из этого множества, если он присутствует - Возвращает:
- true, если это множество содержало указанный элемент
add
public boolean add(E e)
- Определено в:
-
addв интерфейсеCollection<E> - Определено в:
-
addв интерфейсеSet<E> - Переопределяет:
-
addв классеAbstractCollection<E> - Параметры:
-
e- элемент, который нужно добавить в это множество - Возвращает:
- true, если это множество не содержало указанный элемент
containsAll
public boolean containsAll(Collection<?> c)
- Определено в:
-
containsAllв интерфейсеCollection<E> - Определено в:
-
containsAllв интерфейсеSet<E> - Переопределяет:
-
containsAllв классеAbstractCollection<E> - Параметры:
-
c- коллекция, чьё содержание необходимо проверить в этом множестве - Возвращает:
- true, если это множество содержит все элементы указанной коллекции
- Исключения:
-
NullPointerException- если указанная коллекция равна null - См. также:
addAll
public boolean addAll(Collection<? extends E> c)
- Определено в:
-
addAllв интерфейсеCollection<E> - Определено в:
-
addAllв интерфейсеSet<E> - Переопределяет:
-
addAllв классеAbstractCollection<E> - Параметры:
-
c- коллекция, содержащая элементы, которые нужно добавить в это множество - Возвращает:
- true, если это множество изменилось в результате вызова
- Исключения:
-
NullPointerException- если указанная коллекция равна null - См. также:
removeAll
public boolean removeAll(Collection<?> c)
- Specified by:
-
removeAllв интерфейсеCollection<E> - Specified by:
-
removeAllв интерфейсеSet<E> - Overrides:
-
removeAllв классеAbstractSet<E> - Parameters:
-
c- коллекция, содержащая элементы, которые нужно удалить из этого множества - Returns:
-
trueесли это множество изменилось в результате вызова - Throws:
-
ClassCastException- если класс элемента этого множества несовместим с указанной коллекцией (необязательно) -
NullPointerException- если это множество содержит нулевой элемент, а указанная коллекция не допускает нулевых элементов (необязательно), или если указанная коллекция равна null - See Also:
retainAll
public boolean retainAll(Collection<?> c)
- Specified by:
-
retainAllв интерфейсеCollection<E> - Specified by:
-
retainAllв интерфейсеSet<E> - Overrides:
-
retainAllв классеAbstractCollection<E> - Parameters:
-
c- коллекция, содержащая элементы, которые нужно сохранить в этом множестве - Returns:
-
trueесли это множество изменилось в результате вызова - Throws:
-
ClassCastException- если класс элемента этого множества несовместим с указанной коллекцией (необязательно) -
NullPointerException- если это множество содержит нулевой элемент, а указанная коллекция не допускает нулевых элементов (необязательно), или если указанная коллекция равна null - See Also:
iterator
public Iterator<E> iterator()
Возвращаемый итератор предоставляет моментальную копию состояния множества на момент создания итератора. Нет необходимости в синхронизации во время обхода итератора. Итератор НЕ поддерживает метод remove.
- Specified by:
-
iteratorв интерфейсеCollection<E> - Specified by:
-
iteratorв интерфейсеIterable<E> - Specified by:
-
iteratorв интерфейсеSet<E> - Specified by:
-
iteratorв классеAbstractCollection<E> - Returns:
- итератор по элементам в этом множестве
equals
public boolean equals(Object o)
true если указанный объект является тем же объектом, что и этот объект, или если он также является Set и элементы, возвращаемые итератором над указанным множеством, совпадают с элементами, возвращаемыми итератором над этим множеством. Более формально, два итератора считаются возвращающими одинаковые элементы, если они возвращают одинаковое количество элементов, и для каждого элемента e1 возвращаемого итератором над указанным множеством, существует элемент e2 возвращаемый итератором над этим множеством, таким, что Objects.equals(e1, e2). - Specified by:
-
equalsв интерфейсеCollection<E> - Specified by:
-
equalsв интерфейсеSet<E> - Overrides:
-
equalsв классеAbstractSet<E> - Parameters:
-
o- объект, подлежащий сравнению на равенство с этим множеством - Returns:
-
trueесли указанный объект равен этому множеству - See Also:
removeIf
public boolean removeIf(Predicate<? super E> filter)
Collection- Specified by:
-
removeIfв интерфейсеCollection<E> - Parameters:
-
filter- предикат, который возвращаетtrueдля элементов, которые нужно удалить - Returns:
-
trueесли были удалены какие-либо элементы - Throws:
-
NullPointerException- если указанный фильтр равен null
forEach
public void forEach(Consumer<? super E> action)
IterableIterable до тех пор, пока все элементы не будут обработаны или действие не выбросит исключение. Действия выполняются в порядке итерации, если этот порядок указан. Исключение, брошенное действием, передается вызывающему объекту. Поведение этого метода не определено, если действие выполняет побочные эффекты, которые изменяют исходный источник элементов, если только переопределяемый класс не указал политику одновременного изменения.
- Specified by:
-
forEachв интерфейсеIterable<E> - Parameters:
-
action- Действие, которое должно быть выполнено для каждого элемента - Throws:
-
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> - Returns:
Spliteratorпо элементам в этом множестве- Since:
- 1.8
© 1993, 2021, 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/17/docs/api/java.base/java/util/concurrent/CopyOnWriteArraySet.html