- java.lang.Object
-
- java.util.concurrent.CopyOnWriteArrayList<E>
-
- 参数类型
-
E
- 此列表中保留的元素类型
- 实现的所有接口
-
Serializable
,Cloneable
,Iterable<E>
,Collection<E>
,List<E>
,RandomAccess
public class CopyOnWriteArrayList<E>extends Objectimplements List<E>, RandomAccess, Cloneable, Serializable
的一个线程安全的变体ArrayList
,其中所有可变操作(add
,set
,等等)通过对底层数组的最新副本实现。这通常成本太高,但是当遍历操作大大超过突变时,它可能比替代方法更有效,并且在您不能或不想同步遍历但需要排除并发线程之间的干扰时非常有用。 “快照”样式迭代器方法在创建迭代器时使用对数组状态的引用。 这个数组在迭代器的生命周期中永远不会改变,因此干扰是不可能的,并且保证迭代器不会抛出
ConcurrentModificationException
。 自迭代器创建以来,迭代器不会反映列表的添加,删除或更改。 元变化的迭代器操作本身(remove
,set
和add
)不被支持。 这些方法抛出UnsupportedOperationException
。允许使用所有元素,包括
null
。内存一致性影响:与其他并发集合一样,在将对象放入另一个线程中的
CopyOnWriteArrayList
中的该元素后,将对象放入CopyOnWriteArrayList
happen-before之前的操作。此类是Java Collections Framework的成员。
- 从以下版本开始:
- 1.5
- 另请参见:
- Serialized Form
-
-
构造方法摘要
构造方法 构造器 描述 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)
对Iterable
每个元素执行给定操作,直到处理Iterable
所有元素或操作引发异常。E
get(int index)
返回此列表中指定位置的元素。int
hashCode()
返回此列表的哈希码值。int
indexOf(E e, int index)
返回此列表中第一次出现的指定元素的索引,从index
搜索向前,如果找不到该元素,则返回-1。boolean
isEmpty()
如果此列表不包含任何元素,则返回true
。Iterator<E>
iterator()
以适当的顺序返回此列表中元素的迭代器。int
lastIndexOf(E e, int index)
返回此列表中指定元素最后一次出现的索引,从index
向后搜索,如果找不到该元素,则返回-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)
删除此集合中满足给定谓词的所有元素。boolean
retainAll(Collection<?> c)
仅保留此列表中包含在指定集合中的元素。E
set(int index, E element)
用指定的元素替换此列表中指定位置的元素。int
size()
返回此列表中的元素数。Spliterator<E>
spliterator()
在此列表中的元素上返回Spliterator
。List<E>
subList(int fromIndex, int toIndex)
返回此列表中fromIndex
(含)和toIndex
(独占)之间部分的视图。Object[]
toArray()
以适当的顺序(从第一个元素到最后一个元素)返回包含此列表中所有元素的数组。<T> T[]
toArray(T[] a)
以适当的顺序返回包含此列表中所有元素的数组(从第一个元素到最后一个元素); 返回数组的运行时类型是指定数组的运行时类型。String
toString()
返回此列表的字符串表示形式。-
声明方法的接口 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()
返回此列表中的元素数。
-
isEmpty
public boolean isEmpty()
如果此列表不包含任何元素,则返回true
。
-
contains
public boolean contains(Object o)
如果此列表包含指定的元素,则返回true
。 更正式的,返回true
当且仅当此列表包含至少一个元素e
如Objects.equals(o, e)
。
-
indexOf
public int indexOf(E e, int index)
返回此列表中第一次出现的指定元素的索引,从index
向前搜索,如果找不到该元素,则返回-1。 更正式的是,返回最低指数i
如i >= index && Objects.equals(get(i), e)
,如果没有这样的指数则返回-1。- 参数
-
e
- 要搜索的元素 -
index
- 开始搜索的索引 - 结果
- 列表中位置
index
或更高的列表中第一次出现该元素的索引;-1
如果找不到该元素。 - 异常
-
IndexOutOfBoundsException
- 如果指定的索引为负数
-
lastIndexOf
public int lastIndexOf(E e, int index)
返回此列表中指定元素最后一次出现的索引,从index
向后搜索,如果找不到该元素,则返回-1。 更正式的是,返回最高指数i
如i <= index && Objects.equals(get(i), e)
,如果没有这样的指数则返回-1。- 参数
-
e
- 要搜索的元素 -
index
- 开始向后搜索的索引 - 结果
- 此列表中位置小于或等于
index
的元素的最后一次出现的索引; 如果找不到元素,则返回-1。 - 异常
-
IndexOutOfBoundsException
- 如果指定的索引大于或等于此列表的当前大小
-
toArray
public Object[] toArray()
以适当的顺序(从第一个元素到最后一个元素)返回包含此列表中所有元素的数组。返回的数组将是“安全的”,因为此列表不会保留对它的引用。 (换句话说,此方法必须分配一个新数组)。 因此调用者可以自由修改返回的数组。
此方法充当基于阵列和基于集合的API之间的桥梁。
- Specified by:
-
toArray
在界面Collection<E>
- Specified by:
-
toArray
在界面List<E>
- 结果
- 包含此列表中所有元素的数组
- 另请参见:
-
Arrays.asList(Object[])
-
toArray
public <T> T[] toArray(T[] a)
以适当的顺序返回包含此列表中所有元素的数组(从第一个元素到最后一个元素); 返回数组的运行时类型是指定数组的运行时类型。 如果列表适合指定的数组,则返回其中。 否则,将为新数组分配指定数组的运行时类型和此列表的大小。如果此列表适合指定的数组,并且有空余空间(即,数组的元素多于此列表),则紧跟在列表末尾之后的数组中的元素将设置为
null
。 ( 仅当调用者知道此列表不包含任何null元素时,这在确定此列表的长度时很有用。)与
toArray()
方法一样,此方法充当基于阵列和基于集合的API之间的桥梁。 此外,该方法允许精确控制输出阵列的运行时类型,并且在某些情况下可以用于节省分配成本。假设
x
是已知仅包含字符串的列表。 以下代码可用于将列表转储到新分配的String
数组中:String[] y = x.toArray(new String[0]);
toArray(new Object[0])
功能与toArray()
相同。- Specified by:
-
toArray
在界面Collection<E>
- Specified by:
-
toArray
在界面List<E>
- 参数类型
-
T
- 要包含集合的数组的组件类型 - 参数
-
a
- 列表元素要存储的数组,如果它足够大; 否则,为此目的分配相同运行时类型的新数组。 - 结果
- 包含此列表中所有元素的数组
- 异常
-
ArrayStoreException
- 如果指定数组的运行时类型不是此列表中每个元素的运行时类型的超类型 -
NullPointerException
- 如果指定的数组为null
-
get
public E get(int index)
返回此列表中指定位置的元素。- Specified by:
-
get
在界面List<E>
- 参数
-
index
- 要返回的元素的索引 - 结果
- 此列表中指定位置的元素
- 异常
-
IndexOutOfBoundsException
- 如果指数超出范围(index < 0 || index >= size()
)
-
set
public E set(int index, E element)
用指定的元素替换此列表中指定位置的元素。- Specified by:
-
set
在接口List<E>
- 参数
-
index
- 要替换的元素的索引 -
element
- 要存储在指定位置的元素 - 结果
- 先前在指定位置的元素
- 异常
-
IndexOutOfBoundsException
- 如果索引超出范围(index < 0 || index >= size()
)
-
add
public boolean add(E e)
将指定的元素追加到此列表的末尾。- Specified by:
-
add
在界面Collection<E>
- Specified by:
-
add
接口List<E>
- 参数
-
e
- 要附加到此列表的元素 - 结果
-
true
(由Collection.add(E)
指定)
-
add
public void add(int index, E element)
将指定元素插入此列表中的指定位置。 将当前位置的元素(如果有)和任何后续元素向右移动(将其添加到索引中)。- Specified by:
-
add
在界面List<E>
- 参数
-
index
- 要插入指定元素的索引 -
element
- 要插入的元素 - 异常
-
IndexOutOfBoundsException
- 如果索引超出范围(index < 0 || index > size()
)
-
remove
public E remove(int index)
删除此列表中指定位置的元素。 将任何后续元素向左移位(从索引中减去一个元素)。 返回从列表中删除的元素。- Specified by:
-
remove
在界面List<E>
- 参数
-
index
- 要删除的元素的索引 - 结果
- 先前在指定位置的元素
- 异常
-
IndexOutOfBoundsException
- 如果索引超出范围(index < 0 || index >= size()
)
-
remove
public boolean remove(Object o)
从该列表中删除指定元素的第一个匹配项(如果存在)。 如果此列表不包含该元素,则不会更改。 更正式地,删除具有最低索引i
的元素,使得Objects.equals(o, get(i))
(如果存在这样的元素)。 如果此列表包含指定的元素,则返回true
(或等效地,如果此列表因调用而更改)。
-
addIfAbsent
public boolean addIfAbsent(E e)
如果不存在,则追加元素。- 参数
-
e
- 要添加到此列表的元素(如果不存在) - 结果
-
true
如果添加了元素
-
containsAll
public boolean containsAll(Collection<?> c)
如果此列表包含指定集合的所有元素,则返回true
。- Specified by:
-
containsAll
在界面Collection<E>
- Specified by:
-
containsAll
在界面List<E>
- 参数
-
c
- 要在此列表中检查包含的集合 - 结果
-
true
如果此列表包含指定集合的所有元素 - 异常
-
NullPointerException
- 如果指定的集合为null - 另请参见:
-
contains(Object)
-
removeAll
public boolean removeAll(Collection<?> c)
从此列表中删除指定集合中包含的所有元素。 由于需要内部临时数组,因此在此类中这是一项特别昂贵的操作。- Specified by:
-
removeAll
在界面Collection<E>
- Specified by:
-
removeAll
在界面List<E>
- 参数
-
c
- 包含要从此列表中删除的元素的集合 - 结果
-
true
如果此列表因呼叫而更改 - 异常
-
ClassCastException
- 如果此列表的元素的类与指定的集合不兼容( optional ) -
NullPointerException
- 如果此列表包含null元素且指定的集合不允许null元素( optional ),或者指定的集合为null - 另请参见:
-
remove(Object)
-
retainAll
public boolean retainAll(Collection<?> c)
仅保留此列表中包含在指定集合中的元素。 换句话说,从该列表中删除未包含在指定集合中的所有元素。- Specified by:
-
retainAll
在界面Collection<E>
- Specified by:
-
retainAll
在界面List<E>
- 参数
-
c
- 包含要在此列表中保留的元素的集合 - 结果
-
true
如果此列表因呼叫而更改 - 异常
-
ClassCastException
- 如果此列表的元素的类与指定的集合不兼容( optional ) -
NullPointerException
- 如果此列表包含null元素且指定的集合不允许null元素( optional ),或者指定的集合为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)
将指定集合中的所有元素按指定集合的迭代器返回的顺序附加到此列表的末尾。- Specified by:
-
addAll
在界面Collection<E>
- Specified by:
-
addAll
在界面List<E>
- 参数
-
c
- 包含要添加到此列表的元素的集合 - 结果
-
true
如果此列表因呼叫而更改 - 异常
-
NullPointerException
- 如果指定的集合为null - 另请参见:
-
add(Object)
-
addAll
public boolean addAll(int index, Collection<? extends E> c)
从指定位置开始,将指定集合中的所有元素插入此列表。 将当前位置的元素(如果有)和任何后续元素向右移动(增加其索引)。 新元素将按照指定集合的迭代器返回的顺序出现在此列表中。- Specified by:
-
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
每个元素执行给定操作,直到处理Iterable
所有元素或操作引发异常。 如果指定了该顺序,则按迭代顺序执行操作。 操作抛出的异常将转发给调用者。如果操作执行修改元素的基础源的副作用,则此方法的行为未指定,除非重写类已指定并发修改策略。
- Specified by:
-
forEach
在界面Iterable<E>
- 参数
-
action
- 要为每个元素执行的操作 - 异常
-
NullPointerException
- 如果指定的操作为null
-
removeIf
public boolean removeIf(Predicate<? super E> filter)
从界面复制的说明:Collection
删除此集合中满足给定谓词的所有元素。 在迭代期间或通过谓词抛出的错误或运行时异常被中继到调用者。- Specified by:
-
removeIf
在界面Collection<E>
- 参数
-
filter
- 一个谓词,它为要删除的元素返回true
- 结果
-
true
是否删除了任何元素 - 异常
-
NullPointerException
- 如果指定的过滤器为null
-
toString
public String toString()
返回此列表的字符串表示形式。 字符串表示由列表元素的字符串表示形式组成,按迭代器返回的顺序排列,用方括号括起来("[]"
)。 相邻元素由字符", "
(逗号和空格)分隔。 元素将转换为字符串,如String.valueOf(Object)
。
-
equals
public boolean equals(Object o)
将指定对象与此列表进行比较以获得相等性。 返回true
如果指定对象是相同的对象,因为这对象,或者如果它是一个也List
,并通过返回的元素的序列iterator在指定列表是相同的,通过在这个列表中的迭代器返回的序列。 如果两个序列具有相同的长度并且序列中相同位置的相应元素相等,则认为它们是相同的 。 如果Objects.equals(e1, e2)
则认为两个元素e1
和e2
相等 。- Specified by:
-
equals
在界面Collection<E>
- Specified by:
-
equals
在界面List<E>
- 重写:
-
equals
类Object
- 参数
-
o
- 要与此列表进行相等性比较的对象 - 结果
-
true
如果指定的对象等于此列表 - 另请参见:
-
Object.hashCode()
,HashMap
-
hashCode
public int hashCode()
返回此列表的哈希码值。此实现使用
List.hashCode()
中的定义。- Specified by:
-
hashCode
,界面Collection<E>
- Specified by:
-
hashCode
在界面List<E>
- 重写:
-
hashCode
在类Object
- 结果
- 此列表的哈希码值
- 另请参见:
-
Object.equals(java.lang.Object)
,System.identityHashCode(java.lang.Object)
-
iterator
public Iterator<E> iterator()
以适当的顺序返回此列表中元素的迭代器。返回的迭代器提供构造迭代器时列表状态的快照。 遍历迭代器时不需要同步。 该迭代器不支持
remove
方法。
-
listIterator
public ListIterator<E> listIterator()
返回此列表中元素的列表迭代器(按适当顺序)。返回的迭代器提供构造迭代器时列表状态的快照。 遍历迭代器时不需要同步。 该迭代器不支持
remove
,set
或add
方法。- Specified by:
-
listIterator
在界面List<E>
- 结果
- 列表中的元素列表迭代器(按正确顺序)
-
listIterator
public ListIterator<E> listIterator(int index)
从列表中的指定位置开始,返回列表中元素的列表迭代器(按正确顺序)。 指定的索引指示初始调用next
将返回的第一个元素。 对previous
的初始调用将返回指定索引减去1的元素。返回的迭代器提供构造迭代器时列表状态的快照。 遍历迭代器时不需要同步。 该迭代器不支持
remove
,set
或add
方法。- Specified by:
-
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
。分裂器在构造分裂器时提供列表状态的快照。 在分离器上操作时不需要同步。
- Specified by:
-
spliterator
在界面Collection<E>
- Specified by:
-
spliterator
在界面Iterable<E>
- Specified by:
-
spliterator
在界面List<E>
- 结果
- 此列表中的元素为
Spliterator
- 从以下版本开始:
- 1.8
-
subList
public List<E> subList(int fromIndex, int toIndex)
返回此列表中fromIndex
(含)和toIndex
(独占)之间部分的视图。 返回的列表由此列表支持,因此返回列表中的更改将反映在此列表中。如果通过返回列表以外的任何方式修改了支持列表(即此列表),则此方法返回的列表的语义将变为未定义。
- Specified by:
-
subList
在界面List<E>
- 参数
-
fromIndex
-fromIndex
低端点(包括) -
toIndex
-toIndex
高端点(独占) - 结果
- 此列表中指定范围的视图
- 异常
-
IndexOutOfBoundsException
- 非法端点索引值(fromIndex < 0 || toIndex > size || fromIndex > toIndex
)
-
-