Класс 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 |
Возвращает массив, содержащий все элементы в этом множестве; тип времени выполнения возвращаемого массива соответствует указанному массиву. |
Методы, объявленные в классе 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
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[] 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)
- Specified by:
-
removeAllin interfaceCollection<E> - Specified by:
-
removeAllin interfaceSet<E> - Overrides:
-
removeAllin classAbstractSet<E> - Parameters:
-
c- коллекция, содержащая элементы, которые должны быть удалены из этого множества - Returns:
-
trueесли это множество изменилось в результате вызова - Throws:
-
ClassCastException- если класс элемента этого множества несовместим с указанной коллекцией (необязательно) -
NullPointerException- если это множество содержит нулевой элемент, а указанная коллекция не допускает нулевых элементов (необязательно), или если указанная коллекция равна null - See Also:
retainAll
public boolean retainAll(Collection<?> c)
- Specified by:
-
retainAllin interfaceCollection<E> - Specified by:
-
retainAllin interfaceSet<E> - Overrides:
-
retainAllin classAbstractCollection<E> - Parameters:
-
c- коллекция, содержащая элементы, которые должны быть сохранены в этом множестве - Returns:
-
trueесли это множество изменилось в результате вызова - Throws:
-
ClassCastException- если класс элемента этого множества несовместим с указанной коллекцией (необязательно) -
NullPointerException- если это множество содержит нулевой элемент, а указанная коллекция не допускает нулевых элементов (необязательно), или если указанная коллекция равна null - See Also:
iterator
public Iterator<E> iterator()
Возвращаемый итератор предоставляет моментальную снимок состояния множества в момент создания итератора. Синхронизация не требуется при обходе итератора. Итератор не поддерживает метод remove.
equals
public boolean equals(Object o)
true, если указанный объект является тем же объектом, что и этот объект, или если это также Set и элементы, возвращаемые итератором по указанному множеству, такие же, как элементы, возвращаемые итератором по этому множеству. Более формально, два итератора считаются возвращающими те же элементы, если они возвращают одинаковое количество элементов и для каждого элемента e1, возвращаемого итератором по указанному множеству, существует элемент e2, возвращаемый итератором по этому множеству, такой что Objects.equals(e1, e2).- Specified by:
-
equalsin interfaceCollection<E> - Specified by:
-
equalsin interfaceSet<E> - Overrides:
-
equalsin classAbstractSet<E> - Parameters:
-
o- объект для сравнения на равенство с этим множеством - Returns:
-
trueесли указанный объект равен этому множеству - See Also:
removeIf
public boolean removeIf(Predicate<? super E> filter)
Collection- Specified by:
-
removeIfin interfaceCollection<E> - Parameters:
-
filter- предикат, который возвращаетtrueдля удаляемых элементов - Returns:
-
trueесли какие-либо элементы были удалены - Throws:
-
NullPointerException- если заданный фильтр равен null
forEach
public void forEach(Consumer<? super E> action)
IterableIterable до тех пор, пока все элементы не будут обработаны или действие не выбросит исключение. Действия выполняются в порядке итерации, если этот порядок указан. Исключения, выброшенные действием, передаются вызывающей стороне. Поведение этого метода не определено, если действие выполняет побочные эффекты, которые изменяют основной источник элементов, если только переопределяемый класс не указал политику одновременного изменения.
- Specified by:
-
forEachin interfaceIterable<E> - Parameters:
-
action- Действие, которое должно быть выполнено для каждого элемента - Throws:
-
NullPointerException- если указанное действие равно null
spliterator
public Spliterator<E> spliterator()
Spliterator по элементам в этом множестве в порядке, в котором эти элементы были добавлены. Spliterator сообщает о Spliterator.IMMUTABLE, Spliterator.DISTINCT, Spliterator.SIZED и Spliterator.SUBSIZED.
Итератор предоставляет моментальную снимок состояния множества в момент создания итератора. Синхронизация не требуется при работе с итератором.
- Specified by:
-
spliteratorin interfaceCollection<E> - Specified by:
-
spliteratorin interfaceIterable<E> - Specified by:
-
spliteratorin interfaceSet<E> - Returns:
Spliteratorпо элементам в этом множестве- Since:
- 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://download.java.net/java/early_access/jdk24/docs/api/java.base/java/util/concurrent/CopyOnWriteArraySet.html