Класс 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.
- Since:
- 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
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 - См. также:
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 - См. также:
retainAll
public boolean retainAll(Collection<?> c)
- Указано в:
-
retainAllв интерфейсеCollection<E> - Указано в:
-
retainAllв интерфейсеSet<E> - Переопределяет:
-
retainAllв классеAbstractCollection<E> - Параметры:
-
c- набор, содержащий элементы, которые должны быть сохранены в этом наборе - Возвращает:
-
trueесли этот набор был изменён в результате вызова - Исключения:
-
ClassCastException- если класс элемента этого набора несовместим с заданным набором (необязательно) -
NullPointerException- если этот набор содержит нулевой элемент, а заданный набор не допускает нулевые элементы (необязательно), или если заданный набор равен null - См. также:
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если заданный объект равен этому набору - См. также:
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> - Возвращает:
- итератор по элементам в этом наборе
- С тех пор:
- 1.8
© 1993, 2023, 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/21/docs/api/java.base/java/util/concurrent/CopyOnWriteArraySet.html