E
- 此集合中保存的元素的类型
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的成员。
Constructor and Description |
---|
CopyOnWriteArrayList()
创建一个空列表。
|
CopyOnWriteArrayList(Collection<? extends E> c)
按照集合的迭代器返回的顺序创建一个包含指定集合元素的列表。
|
CopyOnWriteArrayList(E[] toCopyIn)
创建一个包含给定数组的副本的列表。
|
Modifier and Type | Method and Description |
---|---|
boolean |
add(E e)
将指定的元素追加到此列表的末尾。
|
void |
add(int index, E element)
在此列表中的指定位置插入指定的元素。
|
boolean |
addAll(Collection<? extends E> c)
按照指定集合的迭代器返回的顺序将指定集合中的所有元素追加到此列表的末尾。
|
boolean |
addAll(int index, 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 所有元素,则返回true。
|
boolean |
equals(Object o)
将指定的对象与此列表进行比较以获得相等性。
|
void |
forEach(Consumer<? super E> action)
对
Iterable 的每个元素执行给定的操作,直到所有元素都被处理或动作引发异常。
|
E |
get(int index)
返回此列表中指定位置的元素。
|
int |
hashCode()
返回此列表的哈希码值。
|
int |
indexOf(E e, int index)
返回此列表中指定元素的第一次出现的索引,从
index 向前
index ,如果未找到该元素,则返回-1。
|
int |
indexOf(Object o)
返回此列表中指定元素的第一次出现的索引,如果此列表不包含元素,则返回-1。
|
boolean |
isEmpty()
如果此列表不包含元素,则返回
true 。
|
Iterator<E> |
iterator()
以正确的顺序返回该列表中的元素的迭代器。
|
int |
lastIndexOf(E e, int index)
返回此列表中指定元素的最后一次出现的索引,从
index ,如果未找到该元素,则返回-1。
|
int |
lastIndexOf(Object o)
返回此列表中指定元素的最后一次出现的索引,如果此列表不包含元素,则返回-1。
|
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)
删除满足给定谓词的此集合的所有元素。
|
void |
replaceAll(UnaryOperator<E> operator)
将该列表的每个元素替换为将该运算符应用于该元素的结果。
|
boolean |
retainAll(Collection<?> c)
仅保留此列表中包含在指定集合中的元素。
|
E |
set(int index, E element)
用指定的元素替换此列表中指定位置的元素。
|
int |
size()
返回此列表中的元素数。
|
void |
sort(Comparator<? super E> c)
使用提供的
Comparator 对此列表进行排序以比较元素。
|
Spliterator<E> |
spliterator()
在此列表中的元素上返回 Spliterator 。
|
List<E> |
subList(int fromIndex, int toIndex)
返回此列表之间的部分视图
fromIndex ,包容和
toIndex ,排斥。
|
Object[] |
toArray()
以正确的顺序(从第一个到最后一个元素)返回一个包含此列表中所有元素的数组。
|
<T> T[] |
toArray(T[] a)
以正确的顺序返回一个包含此列表中所有元素的数组(从第一个到最后一个元素);
返回的数组的运行时类型是指定数组的运行时类型。
|
String |
toString()
返回此列表的字符串表示形式。
|
finalize, getClass, notify, notifyAll, wait, wait, wait
parallelStream, stream
public CopyOnWriteArrayList()
public CopyOnWriteArrayList(Collection<? extends E> c)
c
- 初始持有元素的集合
NullPointerException
- 如果指定的集合为空
public CopyOnWriteArrayList(E[] toCopyIn)
toCopyIn
- 数组(该数组的副本用作内部数组)
NullPointerException
- 如果指定的数组为空
public int size()
public boolean isEmpty()
true
。
public boolean contains(Object o)
true
。
更正式地,返回true
当且仅当该列表至少包含一个元素e
,使得(o==null ? e==null : o.equals(e)) 。
public int indexOf(Object o)
public int indexOf(E e, int index)
index
向前index
,如果未找到元素,则返回-1。
更正式地,返回最低指数i
,使(i >= index && (e==null ? get(i)==null : e.equals(get(i)))) ,或-1如果没有这样的索引。
e
- 要搜索的元素
index
- 开始搜索的索引
index
或更高版本;
-1
如果没有找到该元素。
IndexOutOfBoundsException
- 如果指定的索引为负数
public int lastIndexOf(Object o)
lastIndexOf
在界面
List<E>
o
- 要搜索的元素
public int lastIndexOf(E e, int index)
index
,如果未找到该元素,则返回-1。
更正式地,返回最高指数i
,使(i <= index && (e==null ? get(i)==null : e.equals(get(i)))) ,或-1如果没有这样的索引。
e
- 要搜索的元素
index
- 开始向后搜索的索引
index
的元素的最后一次出现的索引;
-1如果没有找到元素。
IndexOutOfBoundsException
- 如果指定的索引大于或等于此列表的当前大小
public Object[] toArray()
返回的数组将是“安全的”,因为该列表不保留对它的引用。 (换句话说,这个方法必须分配一个新的数组)。 因此,调用者可以自由地修改返回的数组。
此方法充当基于阵列和基于集合的API之间的桥梁。
toArray
在界面
Collection<E>
toArray
在界面
List<E>
Arrays.asList(Object[])
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
在接口
List<E>
T
- 包含集合的数组的运行时类型
a
- 要存储列表的元素的数组,如果它足够大;
否则,为此目的分配相同运行时类型的新数组。
ArrayStoreException
- 如果指定数组的运行时类型不是此列表中每个元素的运行时类型的超类型
NullPointerException
- 如果指定的数组为空
public E get(int index)
get
在接口
List<E>
index
- 要返回的元素的索引
IndexOutOfBoundsException
- 如果索引超出范围(
index < 0 || index >= size() )
public E set(int index, E element)
set
在界面
List<E>
index
- 要替换的元素的索引
element
- 要存储在指定位置的元素
IndexOutOfBoundsException
- 如果索引超出范围(
index < 0 || index >= size() )
public boolean add(E e)
add
在界面
Collection<E>
add
在界面
List<E>
e
- 要附加到此列表的元素
true
(由
Collection.add(E)
指定 )
public void add(int index, E element)
add
在界面
List<E>
index
- 要在其中插入指定元素的索引
element
- 要插入的元素
IndexOutOfBoundsException
- 如果索引超出范围(
index < 0 || index > size() )
public E remove(int index)
remove
在接口
List<E>
index
- 要删除的元素的索引
IndexOutOfBoundsException
- 如果索引超出范围(
index < 0 || index >= size() )
public boolean remove(Object o)
i
的元素,使得(o==null ? get(i)==null : o.equals(get(i))) (如果这样的元素存在)。
如果此列表包含指定的元素(或等效地,如果此列表作为调用的结果而更改),则返回true
。
public boolean addIfAbsent(E e)
e
- 要添加到此列表的元素,如果不存在
true
如果添加元素
public boolean containsAll(Collection<?> c)
true
所有元素,则返回true。
containsAll
在界面
Collection<E>
containsAll
在界面
List<E>
c
- 要在此列表中检查遏制的集合
true
如果此列表包含指定集合的所有元素
NullPointerException
- 如果指定的集合为空
contains(Object)
public boolean removeAll(Collection<?> c)
removeAll
在界面
Collection<E>
removeAll
在接口
List<E>
c
- 包含要从此列表中删除的元素的集合
true
如果此列表因呼叫而更改
ClassCastException
- 如果此列表的元素的类与指定的集合不兼容(
optional )
NullPointerException
- 如果此列表包含空元素,并且指定的集合不允许空元素(
optional ),或者如果指定的集合为空
remove(Object)
public boolean retainAll(Collection<?> c)
retainAll
在界面
Collection<E>
retainAll
在界面
List<E>
c
- 包含要保留在此列表中的元素的集合
true
如果此列表因呼叫而更改
ClassCastException
- 如果此列表的元素的类与指定的集合不兼容(
optional )
NullPointerException
- 如果此列表包含空元素,并且指定的集合不允许空元素(
optional ),或者如果指定的集合为空
remove(Object)
public int addAllAbsent(Collection<? extends E> c)
c
- 包含要添加到此列表的元素的集合
NullPointerException
- 如果指定的集合为空
addIfAbsent(Object)
public void clear()
public boolean addAll(Collection<? extends E> c)
addAll
在界面
Collection<E>
addAll
在界面
List<E>
c
- 包含要添加到此列表的元素的集合
true
如果此列表因呼叫而更改
NullPointerException
- 如果指定的集合为空
add(Object)
public boolean addAll(int index, Collection<? extends E> c)
addAll
在界面
List<E>
index
- 从中指定集合插入第一个元素的索引
c
- 包含要添加到此列表的元素的集合
true
如果此列表因呼叫而更改
IndexOutOfBoundsException
- 如果索引超出范围(
index < 0 || index > size() )
NullPointerException
- 如果指定的集合为空
add(int,Object)
public void forEach(Consumer<? super E> action)
Iterable
复制
Iterable
的每个元素执行给定的操作,直到所有元素都被处理或动作引发异常。
除非实现类另有规定,否则按照迭代的顺序执行操作(如果指定了迭代顺序)。
动作抛出的异常被转发给呼叫者。
public boolean removeIf(Predicate<? super E> filter)
Collection
复制
removeIf
在界面
Collection<E>
filter
- 一个谓词,为要删除的元素返回
true
true
如果有任何元素被删除
public void replaceAll(UnaryOperator<E> operator)
List
复制
replaceAll
在界面
List<E>
operator
- 操作员应用于每个元素
public void sort(Comparator<? super E> c)
List
复制
Comparator
对此列表进行排序以比较元素。
sort
在界面
List<E>
c
- 用于比较列表元素的Comparator
。
A null
值表示应使用元素' natural ordering '
public String toString()
"[]"
)中。
相邻元素由字符", "
(逗号和空格)分隔。
元素被转换为字符串由String.valueOf(Object)
。
public boolean equals(Object o)
true
,或者如果它也是List
,并且iterator在指定列表上返回的元素序列与迭代器在此列表上返回的序列相同。
如果两个序列具有相同的长度,并且序列中相同位置的相应元素相等 ,则认为这两个序列是相同的 。
如果(e1==null ? e2==null : e1.equals(e2))
两个元素e1
和e2
被认为是相等的 。
equals
在接口
Collection<E>
equals
在界面
List<E>
equals
在类别
Object
o
- 要与此列表相等的对象进行比较
true
如果指定的对象等于此列表
Object.hashCode()
, HashMap
public int hashCode()
此实现使用List.hashCode()
中的定义 。
hashCode
在接口
Collection<E>
hashCode
在接口
List<E>
hashCode
在类别
Object
Object.equals(java.lang.Object)
,
System.identityHashCode(java.lang.Object)
public Iterator<E> iterator()
返回的迭代器在构建迭代器时提供列表状态的快照。 遍历迭代器时不需要同步。 该迭代器不支持remove
方法。
public ListIterator<E> listIterator()
返回的迭代器在构建迭代器时提供列表状态的快照。 遍历迭代器时不需要同步。 该迭代器不支持remove
, set
或add
方法。
listIterator
在界面
List<E>
public ListIterator<E> listIterator(int index)
next
将返回的第一个元素。
初始调用previous
将返回指定索引减1的元素。
返回的迭代器在构建迭代器时提供列表状态的快照。 遍历迭代器时不需要同步。 该迭代器不支持remove
, set
或add
方法。
listIterator
在接口
List<E>
index
- 要从列表迭代器返回的第一个元素的索引(通过调用到
next
)
IndexOutOfBoundsException
- 如果索引超出范围(
index < 0 || index > size()
)
public Spliterator<E> spliterator()
Spliterator
。
该Spliterator
报告Spliterator.IMMUTABLE
, Spliterator.ORDERED
, Spliterator.SIZED
和Spliterator.SUBSIZED
。
拼接器在构建拼接器时提供列表状态的快照。 在拼接器上操作时不需要同步。
spliterator
在界面
Iterable<E>
spliterator
在界面
Collection<E>
spliterator
在界面
List<E>
Spliterator
在这个列表中的元素
public List<E> subList(int fromIndex, int toIndex)
fromIndex
,包容和toIndex
,排斥。
返回的列表由此列表支持,因此返回的列表中的更改将反映在此列表中。
如果支持列表(即,此列表)以除了通过返回的列表之外的任何方式进行修改,则此方法返回的列表的语义将变得未定义。
subList
在界面
List<E>
fromIndex
-
fromIndex
低端点(含)
toIndex
-
toIndex
高端点(独占)
IndexOutOfBoundsException
- 非法终点指标值(
fromIndex < 0 || toIndex > size || fromIndex > toIndex )