Класс CopyOnWriteArrayList<E>
- java.lang.Object
-
- java.util.concurrent.CopyOnWriteArrayList<E>
- Type Parameters:
-
E- тип элементов, хранимых в этом списке
- Все реализованные интерфейсы:
-
Serializable,Cloneable,Iterable<E>,Collection<E>,List<E>,RandomAccess
public class CopyOnWriteArrayList<E> extends Object implements List<E>, RandomAccess, Cloneable, Serializable
Потокобезопасная разновидность ArrayList, в которой все изменяющие операции (add, set, и так далее) реализуются путём создания свежей копии базового массива.
Обычно это слишком дорого, но может быть более эффективным, чем альтернативы, когда операции обхода значительно превосходят по числу операции изменения, и полезно, когда вы не можете или не хотите синхронизировать обходы, но при этом хотите исключить взаимное влияние между конкурирующими потоками. Метод итератора в стиле «снимок» использует ссылку на состояние массива на момент создания итератора. Этот массив никогда не изменяется в течение времени жизни итератора, поэтому взаимное влияние невозможно, и гарантируется, что итератор не бросит ConcurrentModificationException. Итератор не будет отражать добавления, удаления или изменения в списке после того, как итератор был создан. Операции изменения элементов на самих итераторах (remove, set, и add) не поддерживаются. Эти методы выбрасывают UnsupportedOperationException.
Разрешены все элементы, включая null.
Эффекты согласованности памяти: Как и в других коллекциях, действия в потоке до помещения объекта в CopyOnWriteArrayList предшествуют последующим действиям по доступу или удалению этого элемента из CopyOnWriteArrayList в другом потоке.
Этот класс является членом Java Collections Framework.
- С момента:
- 1.5
- См. также:
- Сериализованная форма
Конструкторы
| Конструктор | Описание |
|---|---|
CopyOnWriteArrayList() | Создаёт пустой список. |
CopyOnWriteArrayList(E[] toCopyIn) | Создаёт список, содержащий копию заданного массива. |
CopyOnWriteArrayList(Collection<? extends E> c) | Создаёт список, содержащий элементы заданной коллекции в том порядке, в котором они возвращаются итератором коллекции. |
Методы
| Модификатор и тип | Метод | Описание |
|---|---|---|
void | add(int index,
E element) | Вставляет указанный элемент в указанную позицию в этом списке. |
boolean | add(E e) | Добавляет указанный элемент в конец этого списка. |
boolean | addAll(int index,
Collection<? extends E> c) | Вставляет все элементы в заданной коллекции в этот список, начиная с указанной позиции. |
boolean | addAll(Collection<? extends E> c) | Добавляет все элементы в заданной коллекции в конец этого списка в том порядке, в котором они возвращаются итератором заданной коллекции. |
int | addAllAbsent(Collection<? extends E> c) | Добавляет все элементы в заданной коллекции, которых еще нет в этом списке, в конец этого списка в том порядке, в котором они возвращаются итератором заданной коллекции. |
boolean | addIfAbsent(E e) | Добавляет элемент, если он отсутствует. |
void | clear() | Удаляет все элементы из этого списка. |
Object | clone() | Возвращает поверхностную копию этого списка. |
boolean | contains(Object o) | Возвращает true, если этот список содержит указанный элемент. |
boolean | containsAll(Collection<?> c) | Возвращает true, если этот список содержит все элементы заданной коллекции. |
boolean | equals(Object o) | Сравнивает указанный объект с этим списком на предмет равенства. |
void | forEach(Consumer<? super E> action) | Выполняет данное действие для каждого элемента |
E | get(int index) | Возвращает элемент по указанной позиции в этом списке. |
int | hashCode() | Возвращает значение хэш-кода для этого списка. |
int | indexOf(E e,
int index) | Возвращает индекс первого вхождения указанного элемента в этот список, поиск вперёд с |
boolean | isEmpty() | Возвращает true, если этот список не содержит элементов. |
Iterator<E> | iterator() | Возвращает итератор по элементам в этом списке в правильной последовательности. |
int | lastIndexOf(E e,
int index) | Возвращает индекс последнего вхождения указанного элемента в этот список, поиск назад с |
ListIterator<E> | listIterator() | Возвращает итератор списка по элементам в этом списке (в правильной последовательности). |
ListIterator<E> | listIterator(int index) | Возвращает итератор списка по элементам в этом списке (в правильной последовательности), начиная с указанной позиции в списке. |
E | remove(int index) | Удаляет элемент по указанной позиции в этом списке. |
boolean | remove(Object o) | Удаляет первое вхождение указанного элемента из этого списка, если он присутствует. |
boolean | removeAll(Collection<?> c) | Удаляет из этого списка все его элементы, содержащиеся в заданной коллекции. |
boolean | removeIf(Predicate<? super E> filter) | Удаляет все элементы этой коллекции, которые удовлетворяют заданному предикату. |
boolean | retainAll(Collection<?> c) | Сохраняет только элементы в этом списке, которые содержатся в заданной коллекции. |
E | set(int index,
E element) | Заменяет элемент по указанной позиции в этом списке на указанный элемент. |
int | size() | Возвращает количество элементов в этом списке. |
Spliterator<E> | spliterator() | Возвращает |
List<E> | subList(int fromIndex,
int toIndex) | Возвращает представление части этого списка между |
Object[] | toArray() | Возвращает массив, содержащий все элементы в этом списке в правильной последовательности (от первого до последнего элемента). |
<T> T[] | toArray(T[] a) | Возвращает массив, содержащий все элементы в этом списке в правильной последовательности (от первого до последнего элемента); тип времени выполнения возвращаемого массива — заданный массив. |
String | toString() | Возвращает строковое представление этого списка. |
Методы, объявленные в классе java.lang.Object
finalize, getClass, notify, notifyAll, wait, wait, wait Методы, объявленные в интерфейсе java.util.Collection
parallelStream, stream, toArray Методы, объявленные в интерфейсе java.util.List
indexOf, lastIndexOf, replaceAll, sort Конструкторы
CopyOnWriteArrayList
public CopyOnWriteArrayList()
Создаёт пустой список.
CopyOnWriteArrayList
public CopyOnWriteArrayList(Collection<? extends E> c)
Создаёт список, содержащий элементы заданной коллекции в том порядке, в котором они возвращаются итератором коллекции.
- Параметры:
-
c- коллекция начальных элементов - Исключения:
-
NullPointerException- если указанная коллекция равна null
CopyOnWriteArrayList
public CopyOnWriteArrayList(E[] toCopyIn)
Создаёт список, содержащий копию заданного массива.
- Параметры:
-
toCopyIn- массив (копия этого массива используется как внутренний массив) - Исключения:
-
NullPointerException- если указанный массив равен null
Методы
size
public int size()
Возвращает количество элементов в этом списке.
- Определено в:
-
sizeв интерфейсеCollection<E> - Определено в:
-
sizeв интерфейсеList<E> - Возвращает:
- количество элементов в этом списке
isEmpty
public boolean isEmpty()
Возвращает true, если этот список не содержит элементов.
- Определено в:
-
isEmptyв интерфейсеCollection<E> - Определено в:
-
isEmptyв интерфейсеList<E> - Возвращает:
true, если этот список не содержит элементов
contains
public boolean contains(Object o)
Возвращает true, если этот список содержит указанный элемент. Более формально, возвращает true, если и только если этот список содержит по меньшей мере один элемент e, такой что o.equals(e).
- Определено в:
-
containsв интерфейсеCollection<E> - Определено в:
-
containsв интерфейсеList<E> - Параметры:
-
o- элемент, присутствие которого в этом списке требуется проверить - Возвращает:
true, если этот список содержит указанный элемент
indexOf
public int indexOf(E e,
int index) Возвращает индекс первого вхождения указанного элемента в этом списке, идя вперёд с fromIndex, или возвращает -1, если элемент не найден. Более формально, возвращает наименьший индекс i, такой что (i >= fromIndex) && (o.equals(get(i))), или -1, если такого индекса нет.
- Параметры:
-
e- элемент для поиска -
index- индекс, с которого начать поиск - Возвращает:
- индекс первого вхождения элемента в этот список с позиции
fromIndexили позже в списке; -1, если элемент не найден. - Выбрасывает:
-
IndexOutOfBoundsException- если указанный индекс отрицательный
lastIndexOf
public int lastIndexOf(E e,
int index) Возвращает индекс последнего вхождения указанного элемента в этом списке, идя назад с fromIndex, или возвращает -1, если элемент не найден. Более формально, возвращает наибольший индекс i, такой что (i <= fromIndex) && (o.equals(get(i))), или -1, если такого индекса нет.
- Параметры:
-
e- элемент для поиска -
index- индекс, с которого начать обратный поиск - Возвращает:
- индекс последнего вхождения элемента на позиции, меньшей или равной
fromIndexв этом списке; -1, если элемент не найден. - Выбрасывает:
-
IndexOutOfBoundsException- если указанный индекс больше или равен текущему размеру этого списка
clone
public Object clone()
Возвращает неглубокую копию этого списка. (Сами элементы не копируются.)
toArray
public Object[] toArray()
Возвращает массив, содержащий все элементы этого списка в правильной последовательности (от первого до последнего элемента).
Возвращаемый массив будет «безопасным» в том смысле, что к нему не сохраняются ссылки из этого списка. (Другими словами, этот метод должен выделить новый массив). Таким образом, вызывающий метод свободен изменять возвращаемый массив.
Этот метод служит мостом между массивами и коллекциями.
- Определено в:
-
toArrayв интерфейсеCollection<E> - Определено в:
-
toArrayв интерфейсеList<E> - Возвращает:
- массив, содержащий все элементы этого списка
- См. также:
Arrays.asList(Object[])
toArray
public <T> T[] toArray(T[] a)
Возвращает массив, содержащий все элементы этого списка в правильной последовательности (от первого до последнего элемента); тип выполнения возвращаемого массива — тип указанного массива. Если список помещается в указанный массив, он возвращается в нём. В противном случае выделяется новый массив с типом выполнения указанного массива и размером этого списка.
Если этот список помещается в указанный массив с избытком места (т. е. массив имеет больше элементов, чем этот список), элемент в массиве сразу после конца списка устанавливается в null. (Это полезно для определения длины этого списка *только* если вызывающий метод знает, что этот список не содержит каких-либо нулевых элементов.)
Как и метод toArray(), этот метод служит мостом между массивами и коллекциями. Кроме того, этот метод позволяет точно управлять типом выполнения выходного массива и может в определённых обстоятельствах использоваться для экономии затрат на выделение памяти.
Предположим, list — это список, известный тем, что содержит только строки. Следующий код может быть использован для выгрузки списка в вновь выделенный массив типа String[].
String[] y = x.toArray(new String[0]);Обратите внимание, что
toArray(new Object[0]) идентичен по функции toArray().- Определено в:
-
toArrayв интерфейсеCollection<E> - Определено в:
-
toArrayв интерфейсеList<E> - Типы параметров:
-
T- тип компонента массива, содержащего коллекцию - Параметры:
-
a- массив, в который должны быть помещены элементы списка, если он достаточно велик; в противном случае для этой цели выделяется новый массив того же типа выполнения. - Возвращает:
- массив, содержащий все элементы этого списка
- Выбрасывает:
-
ArrayStoreException- если тип выполнения указанного массива не является супертипом типа выполнения каждого элемента в этом списке -
NullPointerException- если указанный массив равен null
get
public E get(int index)
Возвращает элемент по указанной позиции в этом списке.
- Определено в:
-
getв интерфейсеList<E> - Параметры:
-
index- индекс возвращаемого элемента - Возвращает:
- элемент по указанной позиции в этом списке
- Выбрасывает:
-
IndexOutOfBoundsException- если индекс находится вне диапазона (index < 0 || index >= size())
set
public E set(int index,
E element) Заменяет элемент по указанной позиции в этом списке заданным элементом.
- Определено в:
-
setв интерфейсеList<E> - Параметры:
-
index- индекс заменяемого элемента -
element- элемент, который будет сохранён по указанной позиции - Возвращает:
- элемент, который ранее находился по указанной позиции
- Выбрасывает:
-
IndexOutOfBoundsException- если индекс находится вне диапазона (index < 0 || index >= size())
add
public boolean add(E e)
Добавляет указанный элемент в конец этого списка.
- Определено в:
-
addв интерфейсеCollection<E> - Определено в:
-
addв интерфейсеList<E> - Параметры:
-
e- элемент, который будет добавлен в этот список - Возвращает:
true(как указано вCollection.add(E))
add
public void add(int index,
E element) Вставляет указанный элемент в указанную позицию в этом списке. Сдвигает текущий элемент в этой позиции (если таковой имеется) и все последующие элементы вправо (добавляет единицу к их индексам).
- Определено в:
-
addв интерфейсеList<E> - Параметры:
-
index- индекс, в который будет вставлен указанный элемент -
element- вставляемый элемент - Выбрасывает:
-
IndexOutOfBoundsException- если индекс находится вне диапазона (index < 0 || index > size())
remove
public E remove(int index)
Удаляет элемент по указанной позиции в этом списке. Сдвигает все последующие элементы влево (вычитает единицу из их индексов). Возвращает удалённый из списка элемент.
- Определено в:
-
removeв интерфейсеList<E> - Параметры:
-
index- индекс удаляемого элемента - Возвращает:
- элемент, который ранее находился по указанной позиции
- Выбрасывает:
-
IndexOutOfBoundsException- если индекс находится вне диапазона (index < 0 || index >= size())
remove
public boolean remove(Object o)
Удаляет первое вхождение указанного элемента из этого списка, если оно присутствует. Если этот список не содержит элемента, он не изменяется. Более формально, удаляет элемент с наименьшим индексом i, такой что o.equals(get(i)) (если такой элемент существует). Возвращает true, если этот список содержал указанный элемент (или, что эквивалентно, если этот список изменился в результате вызова).
- Определено в:
-
removeв интерфейсеCollection<E> - Определено в:
-
removeв интерфейсеList<E> - Параметры:
-
o- элемент, который нужно удалить из этого списка, если он присутствует - Возвращает:
true, если этот список содержал указанный элемент
addIfAbsent
public boolean addIfAbsent(E e)
Добавляет элемент, если он отсутствует.
- Параметры:
-
e- элемент, который нужно добавить в этот список, если он отсутствует - Возвращает:
true, если элемент был добавлен
containsAll
public boolean containsAll(Collection<?> c)
Возвращает true, если этот список содержит все элементы указанной коллекции.
- Определено в:
-
containsAllв интерфейсеCollection<E> - Определено в:
-
containsAllв интерфейсеList<E> - Параметры:
-
c— коллекция, содержащая элементы, которые проверяются на включение в этот список - Возвращает:
-
trueесли этот список содержит все элементы указанной коллекции - Выбрасывает:
-
NullPointerException— если указанная коллекция равна null - См. также:
contains(Object)
removeAll
public boolean removeAll(Collection<?> c)
Удаляет из этого списка все элементы, содержащиеся в указанной коллекции. Это особенно ресурсоёмкая операция в этом классе из-за необходимости использования внутренней временной массива.
- Определено в:
-
removeAllв интерфейсеCollection<E> - Определено в:
-
removeAllв интерфейсеList<E> - Параметры:
-
c— коллекция, содержащая элементы, которые нужно удалить из этого списка - Возвращает:
-
trueесли список изменился в результате вызова - Выбрасывает:
-
ClassCastException— если класс элемента этого списка несовместим с указанной коллекцией (необязательно) -
NullPointerException— если этот список содержит null-элемент, а указанная коллекция не допускает null-элементов (необязательно), или если указанная коллекция равна null - См. также:
remove(Object)
retainAll
public boolean retainAll(Collection<?> c)
Оставляет в этом списке только элементы, содержащиеся в указанной коллекции. Другими словами, удаляет из этого списка все элементы, которые не содержатся в указанной коллекции.
- Определено в:
-
retainAllв интерфейсеCollection<E> - Определено в:
-
retainAllв интерфейсеList<E> - Параметры:
-
c— коллекция, содержащая элементы, которые должны остаться в этом списке - Возвращает:
-
trueесли список изменился в результате вызова - Выбрасывает:
-
ClassCastException— если класс элемента этого списка несовместим с указанной коллекцией (необязательно) -
NullPointerException— если этот список содержит null-элемент, а указанная коллекция не допускает null-элементов (необязательно), или если указанная коллекция равна null - См. также:
remove(Object)
addAllAbsent
public int addAllAbsent(Collection<? extends E> c)
Добавляет все элементы из указанной коллекции, которые еще не содержатся в этом списке, в конец этого списка в порядке, в котором они возвращаются итератором указанной коллекции.
- Параметры:
-
c— коллекция, содержащая элементы, которые нужно добавить в этот список - Возвращает:
- количество добавленных элементов
- Выбрасывает:
-
NullPointerException— если указанная коллекция равна null - См. также:
addIfAbsent(Object)
clear
public void clear()
Удаляет все элементы из этого списка. Список будет пустым после возврата этого вызова.
addAll
public boolean addAll(Collection<? extends E> c)
Добавляет все элементы из указанной коллекции в конец этого списка в порядке, в котором они возвращаются итератором указанной коллекции.
- Определено в:
-
addAllв интерфейсеCollection<E> - Определено в:
-
addAllв интерфейсеList<E> - Параметры:
-
c— коллекция, содержащая элементы, которые нужно добавить в этот список - Возвращает:
-
trueесли список изменился в результате вызова - Выбрасывает:
-
NullPointerException— если указанная коллекция равна null - См. также:
add(Object)
addAll
public boolean addAll(int index,
Collection<? extends E> c) Вставляет все элементы из указанной коллекции в этот список, начиная с указанной позиции. Сдвигает текущий элемент на этой позиции (если таковой имеется) и все последующие элементы вправо (увеличивает их индексы). Новые элементы появятся в этом списке в порядке, в котором они возвращаются итератором указанной коллекции.
- Определено в:
-
addAllв интерфейсеList<E> - Параметры:
-
index— индекс, с которого нужно вставить первый элемент из указанной коллекции -
c— коллекция, содержащая элементы, которые нужно добавить в этот список - Возвращает:
-
trueесли список изменился в результате вызова - Выбрасывает:
-
IndexOutOfBoundsException— если индекс находится вне допустимого диапазона (index < 0 || index > size()) -
NullPointerException— если указанная коллекция равна null - См. также:
add(int,Object)
forEach
public void forEach(Consumer<? super E> action)
Описание скопировано из интерфейса: Iterable
Выполняет заданное действие для каждого элемента Iterable до тех пор, пока все элементы не будут обработаны или действие не выбросит исключение. Действия выполняются в порядке итерации, если этот порядок указан. Исключения, выброшенные действием, передаются вызывающему методу.
Поведение этого метода не определено, если действие выполняет побочные эффекты, которые изменяют исходный источник элементов, если класс-наследник не определил политику одновременного изменения.
- Определено в:
-
forEachв интерфейсеIterable<E> - Параметры:
-
action— действие, которое нужно выполнить для каждого элемента - Выбрасывает:
-
NullPointerException— если указанное действие равно null
removeIf
public boolean removeIf(Predicate<? super E> filter)
Описание скопировано из интерфейса: Collection
Удаляет все элементы этой коллекции, удовлетворяющие заданному предикату. Ошибки или исключения времени выполнения, выброшенные во время итерации или предикатом, передаются вызывающему методу.
- Определено в:
-
removeIfв интерфейсеCollection<E> - Параметры:
-
filter— предикат, который возвращаетtrueдля элементов, которые нужно удалить - Возвращает:
-
trueесли какие-либо элементы были удалены - Выбрасывает:
-
NullPointerException— если указанный фильтр равен null
toString
public String toString()
Возвращает строковое представление этого списка. Строковое представление состоит из строковых представлений элементов списка в порядке, в котором они возвращаются его итератором, заключённых в квадратные скобки ("[]"). Смежные элементы разделяются символами ", " (запятая и пробел). Элементы преобразуются в строки с помощью String.valueOf(Object).
equals
public boolean equals(Object o)
Сравнивает указанный объект с этим списком на равенство. Возвращает true если указанный объект является тем же объектом, что и этот объект, или если он также является List и последовательность элементов, возвращаемых итератором указанного списка, совпадает с последовательностью, возвращаемой итератором этого списка. Две последовательности считаются одинаковыми, если у них одинаковая длина и соответствующие элементы в одинаковом положении в последовательности равны. Два элемента e1 и e2 считаются равными, если Objects.equals(e1, e2).
- Определено в:
-
equalsв интерфейсеCollection<E> - Определено в:
-
equalsв интерфейсеList<E> - Переопределяет:
-
equalsв классеObject - Параметры:
-
o— объект, который нужно сравнить на равенство с этим списком - Возвращает:
-
trueесли указанный объект равен этому списку - См. также:
-
Object.hashCode(),HashMap
hashCode
public int hashCode()
Возвращает значение хэш-кода для этого списка.
Эта реализация использует определение в List.hashCode().
- Определено в:
-
hashCodeв интерфейсеCollection<E> - Определено в:
-
hashCodeв интерфейсеList<E> - Переопределяет:
-
hashCodeв классеObject - Возвращает:
- значение хэш-кода для этого списка
- См. также:
-
Object.equals(java.lang.Object),System.identityHashCode(java.lang.Object)
iterator
public Iterator<E> iterator()
Возвращает итератор по элементам этого списка в правильной последовательности.
Возвращаемый итератор предоставляет моментальный снимок состояния списка на момент создания итератора. Синхронизация не требуется при обходе итератора. Итератор не поддерживает метод remove.
- Определено в:
-
iteratorв интерфейсеCollection<E> - Определено в:
-
iteratorв интерфейсеIterable<E> - Определено в:
-
iteratorв интерфейсеList<E> - Возвращает:
- итератор по элементам этого списка в правильной последовательности
listIterator
public ListIterator<E> listIterator()
Возвращает итератор списка по элементам в этом списке (в правильной последовательности).
Возвращаемый итератор предоставляет моментальную снимок состояния списка в момент создания итератора. Синхронизация не требуется при обходе итератора. Итератор НЕ поддерживает методы remove, set или add.
- Определено в:
-
listIteratorв интерфейсеList<E> - Возвращает:
- итератор списка по элементам в этом списке (в правильной последовательности)
listIterator
public ListIterator<E> listIterator(int index)
Возвращает итератор списка по элементам в этом списке (в правильной последовательности), начиная с указанной позиции в списке. Указанный индекс указывает на первый элемент, который будет возвращён при начальном вызове next. Начальный вызов previous вернёт элемент с индексом, уменьшенным на единицу.
Возвращаемый итератор предоставляет моментальную снимок состояния списка в момент создания итератора. Синхронизация не требуется при обходе итератора. Итератор НЕ поддерживает методы remove, set или add.
- Определено в:
-
listIteratorв интерфейсеList<E> - Параметры:
-
index- индекс первого элемента, который будет возвращён итератором списка (вызовомnext) - Возвращает:
- итератор списка по элементам в этом списке (в правильной последовательности), начиная с указанной позиции в списке
- Исключения:
-
IndexOutOfBoundsException- если индекс вне допустимого диапазона (index < 0 || index > size())
spliterator
public Spliterator<E> spliterator()
Возвращает Spliterator по элементам в этом списке.
Spliterator сообщает о Spliterator.IMMUTABLE, Spliterator.ORDERED, Spliterator.SIZED и Spliterator.SUBSIZED.
Итератор предоставляет моментальную снимок состояния списка в момент создания итератора. Синхронизация не требуется при работе с итератором.
- Определено в:
-
spliteratorв интерфейсеCollection<E> - Определено в:
-
spliteratorв интерфейсеIterable<E> - Определено в:
-
spliteratorв интерфейсеList<E> - Возвращает:
Spliteratorпо элементам в этом списке- С:
- 1.8
subList
public List<E> subList(int fromIndex,
int toIndex) Возвращает представление части этого списка между fromIndex, включительно, и toIndex, исключая последний. Возвращённый список поддерживается этим списком, поэтому изменения в возвращённом списке отражаются в этом списке.
Семантика списка, возвращаемого этим методом, становится неопределённой, если базовый список (т. е. этот список) изменяется любым способом, кроме как через возвращаемый список.
- Определено в:
-
subListв интерфейсеList<E> - Параметры:
-
fromIndex- нижняя граница (включительно) подсписка -
toIndex- верхняя граница (исключительно) подсписка - Возвращает:
- представление указанного диапазона в этом списке
- Исключения:
-
IndexOutOfBoundsException- для некорректного индекса конечной точки (fromIndex < 0 || toIndex > size || fromIndex > toIndex)
© 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/CopyOnWriteArrayList.html