- 类型参数:
-
E
- 此列表中保存的元素的类型
- 所有实现的接口:
-
Serializable
,Cloneable
,Iterable<E>
,Collection<E>
,List<E>
,RandomAccess
,SequencedCollection<E>
ArrayList
的线程安全变体,其中所有变动操作(add
、set
等)通过制作基础数组的新副本来实现。
通常情况下,这是太昂贵的,但当遍历操作远远超过变动操作时,可能比其他替代方案更有效,并且在您无法或不想同步遍历但需要防止并发线程之间干扰时很有用。"快照"风格的迭代器方法使用对迭代器创建时数组状态的引用。此数组在迭代器的生命周期内永远不会更改,因此干扰是不可能的,并且保证迭代器不会抛出ConcurrentModificationException
。迭代器不会反映自迭代器创建以来列表的添加、移除或更改。迭代器本身的元素更改操作(remove
、set
和add
)不受支持。这些方法会抛出UnsupportedOperationException
。
所有元素都是允许的,包括null
。
内存一致性效果: 与其他并发集合一样,在将对象放入CopyOnWriteArrayList
之前的线程中的操作在另一个线程中访问或从CopyOnWriteArrayList
中删除该元素之后发生之前。
此类是Java集合框架的成员。
- 自 JDK 版本:
- 1.5
- 另请参见:
-
Constructor Summary
ConstructorDescription创建一个空列表。CopyOnWriteArrayList
(E[] toCopyIn) 创建一个包含给定数组副本的列表。CopyOnWriteArrayList
(Collection<? extends E> c) 创建一个包含指定集合元素的列表,按照集合迭代器返回的顺序。 -
Method Summary
Modifier and TypeMethodDescriptionvoid
在列表中指定位置插入指定元素。boolean
将指定元素追加到列表末尾。boolean
addAll
(int index, Collection<? extends E> c) 从指定位置开始,将指定集合中的所有元素插入到列表中。boolean
addAll
(Collection<? extends E> c) 将指定集合中的所有元素按照指定集合迭代器返回的顺序追加到列表末尾。int
addAllAbsent
(Collection<? extends E> c) 将指定集合中尚未包含在此列表中的所有元素按照指定集合迭代器返回的顺序追加到列表末尾。void
将元素作为此集合的第一个元素添加(可选操作)。boolean
addIfAbsent
(E e) 如果不存在,则追加元素。void
将元素作为此集合的最后一个元素添加(可选操作)。void
clear()
从列表中移除所有元素。clone()
返回此列表的浅拷贝。boolean
如果此列表包含指定元素,则返回true
。boolean
containsAll
(Collection<?> c) 如果此列表包含指定集合的所有元素,则返回true
。boolean
将指定对象与此列表进行比较以测试相等性。void
对Iterable
的每个元素执行给定操作,直到所有元素都已处理或操作引发异常。get
(int index) 返回列表中指定位置的元素。getFirst()
获取此集合的第一个元素。getLast()
获取此集合的最后一个元素。int
hashCode()
返回此列表的哈希码值。int
返回列表中从index
开始向前搜索找到的指定元素的第一次出现的索引,如果未找到元素则返回-1。int
返回列表中指定元素的第一次出现的索引,如果此列表不包含元素,则返回-1。boolean
isEmpty()
如果此列表不包含任何元素,则返回true
。iterator()
返回此列表中元素的迭代器,按正确顺序。int
lastIndexOf
(E e, int index) 返回列表中从index
开始向后搜索找到的指定元素的最后一次出现的索引,如果未找到元素则返回-1。int
返回列表中指定元素的最后一次出现的索引,如果此列表不包含元素,则返回-1。返回此列表中元素的列表迭代器(按正确顺序)。listIterator
(int index) 返回此列表中元素的列表迭代器(按正确顺序),从列表中指定位置开始。remove
(int index) 移除列表中指定位置的元素。boolean
从列表中移除指定元素的第一次出现(如果存在)。boolean
removeAll
(Collection<?> c) 从列表中移除包含在指定集合中的所有元素。移除并返回此集合的第一个元素(可选操作)。boolean
移除满足给定谓词的此集合的所有元素。移除并返回此集合的最后一个元素(可选操作)。boolean
retainAll
(Collection<?> c) 仅保留此列表中包含在指定集合中的元素。reversed()
返回此集合的逆序视图。用指定元素替换列表中指定位置的元素。int
size()
返回此列表中的元素数。返回此列表中元素的Spliterator
。subList
(int fromIndex, int toIndex) 返回列表中从fromIndex
(包括)到toIndex
(不包括)的部分的视图。Object[]
toArray()
返回包含此列表中所有元素的数组,按正确顺序(从第一个到最后一个元素)。<T> T[]
toArray
(T[] a) 返回包含此列表中所有元素的数组,按正确顺序(从第一个到最后一个元素);返回数组的运行时类型与指定数组的类型相同。toString()
返回此列表的字符串表示形式。Methods declared in interface java.util.Collection
parallelStream, stream, toArray
Methods declared in interface java.util.List
replaceAll, sort
-
Constructor Details
-
CopyOnWriteArrayList
public CopyOnWriteArrayList()创建一个空列表。 -
CopyOnWriteArrayList
创建一个包含指定集合元素的列表,按照集合迭代器返回的顺序。- 参数:
-
c
- 最初保存的元素的集合 - 抛出:
-
NullPointerException
- 如果指定的集合为 null
-
CopyOnWriteArrayList
创建一个包含给定数组副本的列表。- 参数:
-
toCopyIn
- 数组(使用此数组的副本作为内部数组) - 抛出:
-
NullPointerException
- 如果指定的数组为 null
-
-
Method Details
-
size
public int size()返回此列表中的元素数。 -
isEmpty
public boolean isEmpty()如果此列表不包含任何元素,则返回true
。 -
contains
如果此列表包含指定元素,则返回true
。更正式地说,如果此列表包含至少一个元素e
,使得Objects.equals(o, e)
,则返回true
。 -
indexOf
返回此列表中指定元素的第一次出现的索引,如果此列表不包含该元素,则返回-1。更正式地说,返回最低索引i
,使得Objects.equals(o, get(i))
,如果没有这样的索引,则返回-1。 -
indexOf
返回此列表中指定元素的第一次出现的索引,从index
开始向前搜索,如果未找到该元素,则返回-1。更正式地说,返回最低索引i
,使得i >= index && Objects.equals(get(i), e)
,如果没有这样的索引,则返回-1。- 参数:
-
e
- 要搜索的元素 -
index
- 开始向前搜索的索引 - 返回:
-
此列表中指定元素的第一次出现的索引,位置为
index
或之后在列表中;如果未找到该元素,则返回-1
。 - 抛出:
-
IndexOutOfBoundsException
- 如果指定的索引为负数
-
lastIndexOf
返回此列表中指定元素的最后一次出现的索引,如果此列表不包含该元素,则返回-1。更正式地说,返回最高索引i
,使得Objects.equals(o, get(i))
,如果没有这样的索引,则返回-1。- 指定者:
-
lastIndexOf
在接口List<E>
中 - 参数:
-
o
- 要搜索的元素 - 返回:
- 此列表中指定元素的最后一次出现的索引,如果此列表不包含该元素,则返回-1
-
lastIndexOf
返回此列表中指定元素的最后一次出现的索引,从index
开始向后搜索,如果未找到该元素,则返回-1。更正式地说,返回最高索引i
,使得i <= index && Objects.equals(get(i), e)
,如果没有这样的索引,则返回-1。- 参数:
-
e
- 要搜索的元素 -
index
- 开始向后搜索的索引 - 返回:
-
此列表中小于或等于
index
位置的元素的最后一次出现的索引;如果未找到该元素,则返回-1。 - 抛出:
-
IndexOutOfBoundsException
- 如果指定的索引大于或等于此列表的当前大小
-
clone
返回此列表的浅拷贝。(元素本身不会被复制。) -
toArray
返回一个包含此列表中所有元素的数组,按正确顺序排列(从第一个元素到最后一个元素)。返回的数组将是“安全”的,因为此列表不会保留对它的引用。(换句话说,此方法必须分配一个新数组)。因此,调用者可以自由修改返回的数组。
此方法充当基于数组和基于集合的API之间的桥梁。
-
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
在接口List<E>
中 - 类型参数:
-
T
- 包含集合的数组的组件类型 - 参数:
-
a
- 要存储列表元素的数组,如果足够大;否则,将为此目的分配相同运行时类型的新数组。 - 返回:
- 包含此列表中所有元素的数组
- 抛出:
-
ArrayStoreException
- 如果指定数组的运行时类型不是此列表中每个元素的运行时类型的超类型 -
NullPointerException
- 如果指定的数组为null
-
get
返回此列表中指定位置的元素。- 指定者:
-
get
在接口List<E>
中 - 参数:
-
index
- 要返回的元素的索引 - 返回:
- 此列表中指定位置的元素
- 抛出:
-
IndexOutOfBoundsException
- 如果索引超出范围(index < 0 || index >= size()
)
-
getFirst
获取此集合的第一个元素。- 指定者:
-
getFirst
在接口List<E>
中 - 指定者:
-
getFirst
在接口SequencedCollection<E>
中 - 返回:
- 检索到的元素
- 抛出:
-
NoSuchElementException
- 如果此集合为空 - 自:
- 21
-
getLast
获取此集合的最后一个元素。- 指定者:
-
getLast
在接口List<E>
中 - 指定者:
-
getLast
在接口SequencedCollection<E>
中 - 返回:
- 检索到的元素
- 抛出:
-
NoSuchElementException
- 如果此集合为空 - 自:
- 21
-
set
用指定元素替换此列表中指定位置的元素。- 指定由:
-
set
在接口List<E>
- 参数:
-
index
- 要替换的元素的索引 -
element
- 要存储在指定位置的元素 - 返回:
- 先前在指定位置的元素
- 抛出:
-
IndexOutOfBoundsException
- 如果索引超出范围 (index < 0 || index >= size()
)
-
add
将指定的元素追加到此列表的末尾。- 指定由:
-
add
在接口Collection<E>
- 指定由:
-
add
在接口List<E>
- 参数:
-
e
- 要追加到此列表的元素 - 返回:
-
true
(如Collection.add(E)
中指定的)
-
add
在此列表中的指定位置插入指定的元素。将当前在该位置的元素(如果有)和任何后续元素向右移动(将它们的索引加一)。- 指定由:
-
add
在接口List<E>
- 参数:
-
index
- 要插入指定元素的索引 -
element
- 要插入的元素 - 抛出:
-
IndexOutOfBoundsException
- 如果索引超出范围 (index < 0 || index > size()
)
-
addFirst
将一个元素作为此集合的第一个元素添加(可选操作)。此操作正常完成后,给定元素将成为此集合的成员,并且它将是遇到顺序中的第一个元素。 -
addLast
将一个元素作为此集合的最后一个元素添加(可选操作)。此操作正常完成后,给定元素将成为此集合的成员,并且它将是遇到顺序中的最后一个元素。 -
remove
删除此列表中指定位置的元素。将任何后续元素向左移动(从它们的索引中减去一个)。返回从列表中删除的元素。- 指定由:
-
remove
在接口List<E>
- 参数:
-
index
- 要移除的元素的索引 - 返回:
- 先前在指定位置的元素
- 抛出:
-
IndexOutOfBoundsException
- 如果索引超出范围 (index < 0 || index >= size()
)
-
removeFirst
移除并返回此集合的第一个元素(可选操作)。- 指定由:
-
removeFirst
在接口List<E>
- 指定由:
-
removeFirst
在接口SequencedCollection<E>
- 返回:
- 被移除的元素
- 抛出:
-
NoSuchElementException
- 如果此集合为空 - 自:
- 21
-
removeLast
移除并返回此集合的最后一个元素(可选操作)。- 指定由:
-
removeLast
在接口List<E>
- 指定由:
-
removeLast
在接口SequencedCollection<E>
- 返回:
- 被移除的元素
- 抛出:
-
NoSuchElementException
- 如果此集合为空 - 自:
- 21
-
remove
从此列表中删除指定元素的第一个出现(如果存在)。如果此列表不包含该元素,则不会更改。更正式地说,删除具有最低索引i
的元素,使得Objects.equals(o, get(i))
(如果存在这样的元素)。如果此列表包含指定的元素,则返回true
(或者等效地,如果此列表由于调用而更改)。 -
addIfAbsent
如果不存在,则追加元素。- 参数:
-
e
- 如果不存在,则要添加到此列表的元素 - 返回:
-
true
如果添加了元素
-
containsAll
如果此列表包含指定集合的所有元素,则返回true
。- 指定由:
-
containsAll
在接口Collection<E>
- 指定由:
-
containsAll
在接口List<E>
- 参数:
-
c
- 要检查是否包含在此列表中的集合 - 返回:
-
true
如果此列表包含指定集合的所有元素 - 抛出:
-
NullPointerException
- 如果指定的集合为null - 参见:
-
removeAll
从此列表中删除包含在指定集合中的所有元素。由于需要内部临时数组,因此此类中的此操作特别昂贵。- 指定由:
-
removeAll
在接口Collection<E>
中 - 指定由:
-
removeAll
在接口List<E>
中 - 参数:
-
c
- 包含要从此列表中移除的元素的集合 - 返回:
-
如果调用导致此列表发生更改,则返回
true
- 抛出:
-
ClassCastException
- 如果此列表的元素的类与指定集合不兼容(可选) -
NullPointerException
- 如果此列表包含空元素且指定集合不允许空元素(可选),或者指定集合为null - 参见:
-
retainAll
仅保留此列表中包含在指定集合中的元素。换句话说,从此列表中删除所有不包含在指定集合中的元素。- 指定由:
-
retainAll
在接口Collection<E>
中 - 指定由:
-
retainAll
在接口List<E>
中 - 参数:
-
c
- 包含要在此列表中保留的元素的集合 - 返回:
-
如果调用导致此列表发生更改,则返回
true
- 抛出:
-
ClassCastException
- 如果此列表的元素的类与指定集合不兼容(可选) -
NullPointerException
- 如果此列表包含空元素且指定集合不允许空元素(可选),或者指定集合为null - 参见:
-
addAllAbsent
将指定集合中尚未包含在此列表中的所有元素追加到此列表的末尾,顺序与指定集合的迭代器返回的顺序相同。- 参数:
-
c
- 包含要添加到此列表中的元素的集合 - 返回:
- 添加的元素数量
- 抛出:
-
NullPointerException
- 如果指定的集合为null - 参见:
-
clear
public void clear()从此列表中删除所有元素。此调用返回后,列表将为空。 -
addAll
将指定集合中的所有元素追加到此列表的末尾,顺序与指定集合的迭代器返回的顺序相同。- 指定由:
-
addAll
在接口Collection<E>
中 - 指定由:
-
addAll
在接口List<E>
中 - 参数:
-
c
- 包含要添加到此列表中的元素的集合 - 返回:
-
如果调用导致此列表发生更改,则返回
true
- 抛出:
-
NullPointerException
- 如果指定的集合为null - 参见:
-
addAll
将指定集合中的所有元素插入到此列表中,从指定位置开始。将当前位于该位置的元素(如果有)和任何后续元素向右移动(增加它们的索引)。新元素将按照指定集合的迭代器返回的顺序出现在此列表中。- 指定由:
-
addAll
在接口List<E>
中 - 参数:
-
index
- 要从指定集合中插入第一个元素的索引 -
c
- 包含要添加到此列表中的元素的集合 - 返回:
-
如果调用导致此列表发生更改,则返回
true
- 抛出:
-
IndexOutOfBoundsException
- 如果索引超出范围(index < 0 || index > size()
) -
NullPointerException
- 如果指定的集合为null - 参见:
-
forEach
从接口中复制的描述:Iterable
对Iterable
的每个元素执行给定操作,直到所有元素都已处理或操作引发异常为止。如果指定了顺序,则按迭代顺序执行操作。操作引发的异常将传递给调用者。如果操作执行会修改元素的底层来源并产生副作用,则此方法的行为是未指定的,除非覆盖类已指定了并发修改策略。
- 指定由:
-
forEach
在接口Iterable<E>
中 - 参数:
-
action
- 要对每个元素执行的操作 - 抛出:
-
NullPointerException
- 如果指定的操作为null
-
removeIf
从接口中复制的描述:Collection
删除满足给定谓词的此集合的所有元素。在迭代期间抛出的错误或运行时异常或由谓词引发的异常将传递给调用者。- 指定由:
-
removeIf
在接口Collection<E>
中 - 参数:
-
filter
- 一个返回true
以便移除元素的谓词 - 返回:
-
如果有任何元素被移除,则返回
true
- 抛出:
-
NullPointerException
- 如果指定的过滤器为null
-
toString
返回此列表的字符串表示形式。字符串表示形式由列表元素的字符串表示形式组成,顺序与其迭代器返回的顺序相同,用方括号("[]"
)括起来。相邻元素由字符", "
(逗号和空格)分隔。元素将按照String.valueOf(Object)
进行转换。 -
equals
比较指定的对象与此列表是否相等。如果指定的对象与此对象相同,或者如果它也是一个List
,并且通过指定列表上的迭代器返回的元素序列与通过此列表上的迭代器返回的序列相同,则返回true
。如果两个序列具有相同的长度,并且在序列中相同位置的对应元素是相等的,则认为这两个序列是相同的。如果两个元素e1
和e2
被认为是相等,则Objects.equals(e1, e2)
。 -
hashCode
public int hashCode()返回此列表的哈希码值。此实现使用
List.hashCode()
中的定义。 -
iterator
返回此列表中元素的迭代器,按正确的顺序。返回的迭代器提供了在构造迭代器时列表状态的快照。在遍历迭代器时不需要同步。迭代器不支持
remove
方法。 -
listIterator
返回此列表中元素的列表迭代器(按正确的顺序)。返回的迭代器提供了在构造迭代器时列表状态的快照。在遍历迭代器时不需要同步。迭代器不支持
remove
、set
或add
方法。- 指定者:
-
listIterator
在接口List<E>
- 返回:
- 返回此列表中元素的列表迭代器(按正确的顺序)
-
listIterator
返回此列表中元素的列表迭代器(按正确的顺序),从列表中指定的位置开始。指定的索引表示通过初始调用next
将返回的第一个元素。初始调用previous
将返回指定索引减一的元素。返回的迭代器提供了在构造迭代器时列表状态的快照。在遍历迭代器时不需要同步。迭代器不支持
remove
、set
或add
方法。- 指定者:
-
listIterator
在接口List<E>
- 参数:
-
index
- 要从列表迭代器返回的第一个元素的索引(通过调用next
) - 返回:
- 返回此列表中元素的列表迭代器(按正确的顺序),从列表中指定的位置开始
- 抛出:
-
IndexOutOfBoundsException
- 如果索引超出范围(index < 0 || index > size()
)
-
spliterator
返回此列表中元素的Spliterator
。Spliterator
报告Spliterator.IMMUTABLE
、Spliterator.ORDERED
、Spliterator.SIZED
和Spliterator.SUBSIZED
。在操作spliterator时,spliterator提供了在构造spliterator时列表状态的快照。不需要在操作spliterator时进行同步。
- 指定者:
-
spliterator
在接口Collection<E>
- 指定者:
-
spliterator
在接口Iterable<E>
- 指定者:
-
spliterator
在接口List<E>
- 返回:
-
返回此列表中元素的
Spliterator
- 自:
- 1.8
-
subList
返回此列表中从fromIndex
(包括)到toIndex
(不包括)的部分的视图。返回的列表由此列表支持,因此返回列表中的更改会反映在此列表中。如果通过返回的列表以外的任何方式修改支持列表(即,此列表),则此方法返回的列表的语义将变得不确定。
- 指定者:
-
subList
在接口List<E>
- 参数:
-
fromIndex
- 子列表的低端点(包括) -
toIndex
- 子列表的高端点(不包括) - 返回:
- 返回此列表中指定范围的视图
- 抛出:
-
IndexOutOfBoundsException
- 对于非法的端点索引值(fromIndex < 0 || toIndex > size || fromIndex > toIndex
)
-
reversed
返回此集合的逆序视图。返回视图中元素的遭遇顺序与此集合中元素的遭遇顺序相反。逆序排序会影响所有对顺序敏感的操作,包括对返回视图集合的操作。如果集合实现允许修改此视图,则对此视图的修改会“写入”到基础集合。对基础集合的更改可能会或可能不会在此逆序视图中可见,这取决于实现。允许对逆序视图进行修改,并将传播到此列表。此外,对此列表的修改将在逆序视图中可见。逆序视图的子列表和迭代器具有与此列表相同的限制。
-