- 类型参数:
E- 此list中包含的元素类型
- 所有已实现的接口:
Serializable,Cloneable,Iterable<E>,Collection<E>,List<E>,RandomAccess
ArrayList 的线程安全变体,其中所有可变操作(add、set 等)都是通过制作底层数组的新副本来实现的。
这通常成本太高,但当遍历操作的数量远远超过突变时,它可能more 比替代方法更有效,并且在您不能或不想同步遍历但需要排除并发线程之间的干扰时很有用。 “快照”样式的迭代器方法在创建迭代器时使用对数组状态的引用。这个数组在迭代器的生命周期内永远不会改变,所以干扰是不可能的,迭代器保证不会抛出 ConcurrentModificationException 。迭代器不会反映自迭代器创建以来对列表的添加、删除或更改。不支持对迭代器本身(remove、set 和 add)进行元素更改操作。这些方法抛出 UnsupportedOperationException 。
允许所有元素,包括 null 。
内存一致性影响:与其他并发集合一样,在将对象放入 CopyOnWriteArrayList 发生在之前 之前线程中的操作是在另一个线程中从 CopyOnWriteArrayList 访问或删除该元素之后的操作。
此类是 Java 集合框架 的成员。
- 自从:
- 1.5
- 参见:
-
构造方法总结
构造方法构造方法描述创建一个空列表。CopyOnWriteArrayList(E[] toCopyIn) 创建一个包含给定数组副本的列表。CopyOnWriteArrayList(Collection<? extends E> c) 创建一个包含指定集合元素的列表,按照集合迭代器返回元素的顺序。 -
方法总结
修饰符和类型方法描述void在此list中的指定位置插入指定元素。boolean将指定的元素附加到此list的末尾。booleanaddAll(int index, Collection<? extends E> c) 将指定集合中的所有元素插入此list,从指定位置开始。booleanaddAll(Collection<? extends E> c) 按照指定集合的迭代器返回的顺序,将指定集合中的所有元素追加到此list的末尾。intaddAllAbsent(Collection<? extends E> c) 将指定集合中尚未包含在此list中的所有元素追加到此list的末尾,按照它们由指定集合的迭代器返回的顺序。booleanaddIfAbsent(E e) 追加元素(如果不存在)。voidclear()从此list中删除所有元素。clone()返回此list的浅表副本。boolean如果此list包含指定元素,则返回true。booleancontainsAll(Collection<?> c) 如果此list包含指定集合的所有元素,则返回true。boolean比较指定对象与此list是否相等。void对Iterable的每个元素执行给定的操作,直到处理完所有元素或操作引发异常。get(int index) 返回此list中指定位置的元素。inthashCode()返回此list的哈希码值。int返回此list中指定元素第一次出现的索引,从index向前搜索,如果未找到该元素,则返回 -1。int返回此list中指定元素第一次出现的索引,如果此list不包含该元素,则返回 -1。booleanisEmpty()如果此list不包含任何元素,则返回true。iterator()以正确的顺序返回此list中元素的迭代器。intlastIndexOf(E e, int index) 返回此list中指定元素最后一次出现的索引,从index向后搜索,如果未找到该元素,则返回 -1。int返回此list中指定元素最后一次出现的索引,如果此list不包含该元素,则返回 -1。返回此list中元素的列表迭代器(以正确的顺序)。listIterator(int index) 返回此list中元素的列表迭代器(以适当的顺序),从列表中的指定位置开始。remove(int index) 移除此list中指定位置的元素。boolean从此list中移除第一次出现的指定元素(如果存在)。booleanremoveAll(Collection<?> c) 从此list中移除指定集合中包含的所有元素。boolean移除此集合中满足给定谓词的所有元素。booleanretainAll(Collection<?> c) 仅保留此list中包含在指定集合中的元素。用指定元素替换此list中指定位置的元素。intsize()返回此list中的元素数。在此list中的元素上返回一个Spliterator。subList(int fromIndex, int toIndex) 返回此list中介于fromIndex和toIndex之间的部分的视图,不包括在内。Object[]toArray()返回一个数组,其中包含此list中按正确顺序(从第一个元素到最后一个元素)的所有元素。<T> T[]toArray(T[] a) 以正确的顺序(从第一个元素到最后一个元素)返回一个包含此list中所有元素的数组;返回数组的运行时类型是指定数组的类型。toString()返回此list的字符串表示形式。在接口 java.util.Collection 中声明的方法
parallelStream, stream, toArray在接口 java.util.List 中声明的方法
replaceAll, sort
-
构造方法详细信息
-
CopyOnWriteArrayList
public CopyOnWriteArrayList()创建一个空列表。 -
CopyOnWriteArrayList
创建一个包含指定集合元素的列表,按照集合迭代器返回元素的顺序。- 参数:
c- 最初持有的元素的集合- 抛出:
NullPointerException- 如果指定的集合为空
-
CopyOnWriteArrayList
创建一个包含给定数组副本的列表。- 参数:
toCopyIn- 数组(此数组的副本用作内部数组)- 抛出:
NullPointerException- 如果指定数组为空
-
-
方法详情
-
size
public int size()返回此list中的元素数。 -
isEmpty
public boolean isEmpty()如果此list不包含任何元素,则返回true。 -
contains
如果此list包含指定元素,则返回true。更正式地说,返回true当且仅当此list包含至少一个元素e使得Objects.equals(o, e)。 -
indexOf
返回此list中指定元素第一次出现的索引,如果此list不包含该元素,则返回 -1。更正式地说,返回最低索引i这样Objects.equals(o, get(i)),或 -1 如果没有这样的索引。 -
indexOf
返回此list中指定元素第一次出现的索引,从index向前搜索,如果未找到该元素,则返回 -1。更正式地说,返回最低索引i这样i >= index && Objects.equals(get(i), e),或 -1 如果没有这样的索引。- 参数:
e- 要搜索的元素index- 开始搜索的索引- 返回:
-
此list中第一个元素在位置
index或列表中出现的索引;-1如果未找到该元素。 - 抛出:
IndexOutOfBoundsException- 如果指定索引为负
-
lastIndexOf
返回此list中指定元素最后一次出现的索引,如果此list不包含该元素,则返回 -1。更正式地说,返回最高索引i这样Objects.equals(o, get(i)),或者 -1 如果没有这样的索引。- 指定者:
lastIndexOf在接口List<E>中- 参数:
o- 要搜索的元素- 返回:
- 此list中指定元素最后一次出现的索引,如果此list不包含该元素,则为 -1
-
lastIndexOf
返回此list中指定元素最后一次出现的索引,从index向后搜索,如果未找到该元素,则返回 -1。更正式地说,返回最高索引i这样i <= index && Objects.equals(get(i), e),或者 -1 如果没有这样的索引。- 参数:
e- 要搜索的元素index- 开始向后搜索的索引- 返回:
-
此list中小于或等于
index的元素最后一次出现的索引; -1 如果未找到该元素。 - 抛出:
IndexOutOfBoundsException- 如果指定索引大于或等于此list的当前大小
-
clone
返回此list的浅表副本。 (元素本身不会被复制。) -
toArray
返回一个数组,其中包含此list中按正确顺序(从第一个元素到最后一个元素)的所有元素。返回的数组将是“安全的”,因为此list不维护对它的引用。 (换句话说,这个方法必须分配一个新数组)。调用者因此可以自由修改返回的数组。
此方法充当基于数组和基于集合的 API 之间的桥梁。
-
toArray
public <T> T[] toArray(T[] a) 以正确的顺序(从第一个元素到最后一个元素)返回一个包含此list中所有元素的数组;返回数组的运行时类型是指定数组的类型。如果列表适合指定的数组,则在其中返回。否则,将使用指定数组的运行时类型和此list的大小分配一个新数组。如果此list适合指定的数组并有剩余空间(即,数组的元素多于此list),则紧接列表末尾的数组中的元素设置为
null。 (这对于确定此list的长度很有用仅有的如果调用者知道此list不包含任何空元素。)与
toArray()方法一样,此方法充当基于数组和基于集合的 API 之间的桥梁。此外,此方法允许精确控制输出数组的运行时类型,并且在某些情况下可用于节省分配成本。假设
x是已知仅包含字符串的列表。以下代码可用于将列表转储到新分配的String数组中:
请注意,String[] y = x.toArray(new String[0]);toArray(new Object[0])在功能上与toArray()相同。- 指定者:
toArray在接口Collection<E>中- 指定者:
toArray在接口List<E>中- 类型参数:
T- 包含集合的数组的组件类型- 参数:
a- 列表元素要存储到的数组,如果它足够大的话;否则,为此分配一个相同运行时类型的新数组。- 返回:
- 包含此list中所有元素的数组
- 抛出:
ArrayStoreException- 如果指定数组的运行时类型不是此list中每个元素的运行时类型的超类型NullPointerException- 如果指定数组为空
-
get
返回此list中指定位置的元素。- 指定者:
get在接口List<E>中- 参数:
index- 要返回的元素的索引- 返回:
- 此list中指定位置的元素
- 抛出:
IndexOutOfBoundsException- 如果索引超出范围 (index < 0 || index >= size())
-
set
用指定元素替换此list中指定位置的元素。- 指定者:
set在接口List<E>中- 参数:
index- 要替换的元素的索引element- 要存储在指定位置的元素- 返回:
- 先前在指定位置的元素
- 抛出:
IndexOutOfBoundsException- 如果索引超出范围 (index < 0 || index >= size())
-
add
将指定的元素附加到此list的末尾。- 指定者:
add在接口Collection<E>中- 指定者:
add在接口List<E>中- 参数:
e- 要附加到此list的元素- 返回:
true(由Collection.add(E)指定)
-
add
在此list中的指定位置插入指定元素。将当前位于该位置的元素(如果有)和任何后续元素向右移动(将其索引加一)。- 指定者:
add在接口List<E>中- 参数:
index- 要插入指定元素的索引element- 要插入的元素- 抛出:
IndexOutOfBoundsException- 如果索引超出范围 (index < 0 || index > size())
-
remove
移除此list中指定位置的元素。将任何后续元素向左移动(从其索引中减去一个)。返回从列表中删除的元素。- 指定者:
remove在接口List<E>中- 参数:
index- 要删除的元素的索引- 返回:
- 先前在指定位置的元素
- 抛出:
IndexOutOfBoundsException- 如果索引超出范围 (index < 0 || index >= size())
-
remove
从此list中移除第一次出现的指定元素(如果存在)。如果此list不包含该元素,则它保持不变。更正式地说,删除具有最低索引i的元素,这样Objects.equals(o, get(i))(如果存在这样的元素)。如果此list包含指定元素,则返回true(或者等效地,如果此list因调用而更改)。 -
addIfAbsent
追加元素(如果不存在)。- 参数:
e- 要添加到此list中的元素(如果不存在)- 返回:
true如果添加了元素
-
containsAll
如果此list包含指定集合的所有元素,则返回true。- 指定者:
containsAll在接口Collection<E>中- 指定者:
containsAll在接口List<E>中- 参数:
c- 要检查此list中是否包含的集合- 返回:
true如果此list包含指定集合的所有元素- 抛出:
NullPointerException- 如果指定的集合为空- 参见:
-
removeAll
从此list中移除指定集合中包含的所有元素。由于需要内部临时数组,因此这是此类中特别昂贵的操作。- 指定者:
removeAll在接口Collection<E>中- 指定者:
removeAll在接口List<E>中- 参数:
c- 包含要从此list中删除的元素的集合- 返回:
true如果此list因调用而更改- 抛出:
ClassCastException- 如果此list元素的类与指定集合不兼容 (optional)NullPointerException- 如果此list包含空元素并且指定的集合不允许空元素 (optional),或者如果指定的集合为空- 参见:
-
retainAll
仅保留此list中包含在指定集合中的元素。换句话说,从该列表中删除所有未包含在指定集合中的元素。- 指定者:
retainAll在接口Collection<E>中- 指定者:
retainAll在接口List<E>中- 参数:
c- 包含要保留在此list中的元素的集合- 返回:
true如果此list因调用而更改- 抛出:
ClassCastException- 如果此list元素的类与指定集合不兼容 (optional)NullPointerException- 如果此list包含空元素并且指定的集合不允许空元素 (optional),或者如果指定的集合为空- 参见:
-
addAllAbsent
将指定集合中尚未包含在此list中的所有元素追加到此list的末尾,按照它们由指定集合的迭代器返回的顺序。- 参数:
c- 包含要添加到此list的元素的集合- 返回:
- 添加的元素数量
- 抛出:
NullPointerException- 如果指定的集合为空- 参见:
-
clear
public void clear()从此list中删除所有元素。此调用返回后列表将为空。 -
addAll
按照指定集合的迭代器返回的顺序,将指定集合中的所有元素追加到此list的末尾。- 指定者:
addAll在接口Collection<E>中- 指定者:
addAll在接口List<E>中- 参数:
c- 包含要添加到此list的元素的集合- 返回:
true如果此list因调用而更改- 抛出:
NullPointerException- 如果指定的集合为空- 参见:
-
addAll
将指定集合中的所有元素插入此list,从指定位置开始。将当前位于该位置的元素(如果有)和任何后续元素向右移动(增加它们的索引)。新元素将按照指定集合的迭代器返回的顺序出现在该列表中。- 指定者:
addAll在接口List<E>中- 参数:
index- 从指定集合中插入第一个元素的索引c- 包含要添加到此list的元素的集合- 返回:
true如果此list因调用而更改- 抛出:
IndexOutOfBoundsException- 如果索引超出范围 (index < 0 || index > size())NullPointerException- 如果指定的集合为空- 参见:
-
forEach
从接口Iterable复制的描述对Iterable的每个元素执行给定的操作,直到处理完所有元素或操作引发异常。如果指定了迭代顺序,则将按迭代顺序执行操作。操作抛出的异常被转发给调用者。如果操作执行修改元素的底层源的副作用,则此方法的行为是未指定的,除非重写类已指定并发修改策略。
- 指定者:
forEach在接口Iterable<E>中- 参数:
action- 对每个元素执行的操作- 抛出:
NullPointerException- 如果指定的操作为空
-
removeIf
从接口Collection复制的描述移除此集合中满足给定谓词的所有元素。迭代期间或由谓词抛出的错误或运行时异常将传递给调用者。- 指定者:
removeIf在接口Collection<E>中- 参数:
filter- 为要删除的元素返回true的谓词- 返回:
true如果删除了任何元素- 抛出:
NullPointerException- 如果指定的过滤器为空
-
toString
返回此list的字符串表示形式。字符串表示形式由列表元素的字符串表示形式组成,这些元素按照其迭代器返回的顺序排列,括在方括号 ("[]") 中。相邻元素由字符", "(逗号和空格)分隔。元素按String.valueOf(Object)转换为字符串。 -
equals
-
hashCode
public int hashCode()返回此list的哈希码值。此实现使用
List.hashCode()中的定义。 -
iterator
以正确的顺序返回此list中元素的迭代器。返回的迭代器提供构造迭代器时列表状态的快照。遍历迭代器时不需要同步。迭代器确实 NOT 支持
remove方法。 -
listIterator
返回此list中元素的列表迭代器(以正确的顺序)。返回的迭代器提供构造迭代器时列表状态的快照。遍历迭代器时不需要同步。迭代器确实NOT 支持
remove、set或add方法。- 指定者:
listIterator在接口List<E>中- 返回:
- 此list中元素的列表迭代器(按正确顺序)
-
listIterator
返回此list中元素的列表迭代器(以适当的顺序),从列表中的指定位置开始。指定的索引指示将由对next的初始调用返回的第一个元素。对previous的初始调用将返回指定索引减一的元素。返回的迭代器提供构造迭代器时列表状态的快照。遍历迭代器时不需要同步。迭代器确实NOT 支持
remove、set或add方法。- 指定者:
listIterator在接口List<E>中- 参数:
index- 从列表迭代器返回的第一个元素的索引(通过调用next)- 返回:
- 列表中元素的列表迭代器(以适当的顺序),从列表中的指定位置开始
- 抛出:
IndexOutOfBoundsException- 如果索引超出范围 (index < 0 || index > size())
-
spliterator
在此list中的元素上返回一个Spliterator。Spliterator报告Spliterator.IMMUTABLE、Spliterator.ORDERED、Spliterator.SIZED和Spliterator.SUBSIZED。拆分器提供构建拆分器时列表状态的快照。在分离器上运行时不需要同步。
- 指定者:
spliterator在接口Collection<E>中- 指定者:
spliterator在接口Iterable<E>中- 指定者:
spliterator在接口List<E>中- 返回:
-
a
Spliterator覆盖此list中的元素 - 自从:
- 1.8
-
subList
返回此list中介于fromIndex和toIndex之间的部分的视图,不包括在内。返回列表受此list支持,因此返回列表中的更改会反映在此list中。如果支持列表(即此list)以除通过返回列表之外的任何方式修改,则此方法返回的列表的语义将变得未定义。
- 指定者:
subList在接口List<E>中- 参数:
fromIndex- subList 的低端点(包括)toIndex- 子列表的高端点(不包括)- 返回:
- 此list中指定范围的视图
- 抛出:
IndexOutOfBoundsException- 对于非法端点索引值 (fromIndex < 0 || toIndex > size || fromIndex > toIndex)
-