模块 java.base

类 CopyOnWriteArrayList<E>

java.lang.Object
java.util.concurrent.CopyOnWriteArrayList<E>
类型参数:
E - 此list中包含的元素类型
所有已实现的接口:
Serializable , Cloneable , Iterable<E> , Collection<E> , List<E> , RandomAccess

public class CopyOnWriteArrayList<E> extends Object implements List <E>, RandomAccess , Cloneable , Serializable
ArrayList 的线程安全变体,其中所有可变操作(addset 等)都是通过制作底层数组的新副本来实现的。

这通常成本太高,但当遍历操作的数量远远超过突变时,它可能more 比替代方法更有效,并且在您不能或不想同步遍历但需要排除并发线程之间的干扰时很有用。 “快照”样式的迭代器方法在创建迭代器时使用对数组状态的引用。这个数组在迭代器的生命周期内永远不会改变,所以干扰是不可能的,迭代器保证不会抛出 ConcurrentModificationException 。迭代器不会反映自迭代器创建以来对列表的添加、删除或更改。不支持对迭代器本身(removesetadd)进行元素更改操作。这些方法抛出 UnsupportedOperationException

允许所有元素,包括 null

内存一致性影响:与其他并发集合一样,在将对象放入 CopyOnWriteArrayList 发生在之前 之前线程中的操作是在另一个线程中从 CopyOnWriteArrayList 访问或删除该元素之后的操作。

此类是 Java 集合框架 的成员。

自从:
1.5
参见:
  • 构造方法总结

    构造方法
    构造方法
    描述
    创建一个空列表。
    CopyOnWriteArrayList(E[] toCopyIn)
    创建一个包含给定数组副本的列表。
    创建一个包含指定集合元素的列表,按照集合迭代器返回元素的顺序。
  • 方法总结

    修饰符和类型
    方法
    描述
    void
    add(int index, E element)
    在此list中的指定位置插入指定元素。
    boolean
    add(E e)
    将指定的元素附加到此list的末尾。
    boolean
    addAll(int index, Collection<? extends E> c)
    将指定集合中的所有元素插入此list,从指定位置开始。
    boolean
    addAll(Collection<? extends E> c)
    按照指定集合的迭代器返回的顺序,将指定集合中的所有元素追加到此list的末尾。
    int
    addAllAbsent(Collection<? extends E> c)
    将指定集合中尚未包含在此list中的所有元素追加到此list的末尾,按照它们由指定集合的迭代器返回的顺序。
    boolean
    追加元素(如果不存在)。
    void
    从此list中删除所有元素。
    返回此list的浅表副本。
    boolean
    如果此list包含指定元素,则返回 true
    boolean
    如果此list包含指定集合的所有元素,则返回 true
    boolean
    比较指定对象与此list是否相等。
    void
    forEach(Consumer<? super E> action)
    Iterable 的每个元素执行给定的操作,直到处理完所有元素或操作引发异常。
    E
    get(int index)
    返回此list中指定位置的元素。
    int
    返回此list的哈希码值。
    int
    indexOf(E e, int index)
    返回此list中指定元素第一次出现的索引,从 index 向前搜索,如果未找到该元素,则返回 -1。
    int
    返回此list中指定元素第一次出现的索引,如果此list不包含该元素,则返回 -1。
    boolean
    如果此list不包含任何元素,则返回 true
    以正确的顺序返回此list中元素的迭代器。
    int
    lastIndexOf(E e, int index)
    返回此list中指定元素最后一次出现的索引,从 index 向后搜索,如果未找到该元素,则返回 -1。
    int
    返回此list中指定元素最后一次出现的索引,如果此list不包含该元素,则返回 -1。
    返回此list中元素的列表迭代器(以正确的顺序)。
    listIterator(int index)
    返回此list中元素的列表迭代器(以适当的顺序),从列表中的指定位置开始。
    E
    remove(int index)
    移除此list中指定位置的元素。
    boolean
    从此list中移除第一次出现的指定元素(如果存在)。
    boolean
    从此list中移除指定集合中包含的所有元素。
    boolean
    removeIf(Predicate<? super E> filter)
    移除此集合中满足给定谓词的所有元素。
    boolean
    仅保留此list中包含在指定集合中的元素。
    E
    set(int index, E element)
    用指定元素替换此list中指定位置的元素。
    int
    size()
    返回此list中的元素数。
    在此list中的元素上返回一个 Spliterator
    subList(int fromIndex, int toIndex)
    返回此list中介于 fromIndextoIndex 之间的部分的视图,不包括在内。
    返回一个数组,其中包含此list中按正确顺序(从第一个元素到最后一个元素)的所有元素。
    <T> T[]
    toArray(T[] a)
    以正确的顺序(从第一个元素到最后一个元素)返回一个包含此list中所有元素的数组;返回数组的运行时类型是指定数组的类型。
    返回此list的字符串表示形式。

    在类 java.lang.Object 中声明的方法

    finalize, getClass, notify, notifyAll, wait, wait, wait

    在接口 java.util.Collection 中声明的方法

    parallelStream, stream, toArray

    在接口 java.util.List 中声明的方法

    replaceAll, sort
  • 构造方法详细信息

    • CopyOnWriteArrayList

      public CopyOnWriteArrayList()
      创建一个空列表。
    • CopyOnWriteArrayList

      public CopyOnWriteArrayList(Collection <? extends E > c)
      创建一个包含指定集合元素的列表,按照集合迭代器返回元素的顺序。
      参数:
      c - 最初持有的元素的集合
      抛出:
      NullPointerException - 如果指定的集合为空
    • CopyOnWriteArrayList

      public CopyOnWriteArrayList(E [] toCopyIn)
      创建一个包含给定数组副本的列表。
      参数:
      toCopyIn - 数组(此数组的副本用作内部数组)
      抛出:
      NullPointerException - 如果指定数组为空
  • 方法详情

    • size

      public int size()
      返回此list中的元素数。
      指定者:
      size 在接口 Collection<E>
      指定者:
      size 在接口 List<E>
      返回:
      此list中的元素数
    • isEmpty

      public boolean isEmpty()
      如果此list不包含任何元素,则返回 true
      指定者:
      isEmpty 在接口 Collection<E>
      指定者:
      isEmpty 在接口 List<E>
      返回:
      true 如果这个列表不包含任何元素
    • contains

      public boolean contains(Object  o)
      如果此list包含指定元素,则返回 true。更正式地说,返回 true 当且仅当此list包含至少一个元素 e 使得 Objects.equals(o, e)
      指定者:
      contains 在接口 Collection<E>
      指定者:
      contains 在接口 List<E>
      参数:
      o - 要测试其在此list中是否存在的元素
      返回:
      true 如果这个列表包含指定的元素
    • indexOf

      public int indexOf(Object  o)
      返回此list中指定元素第一次出现的索引,如果此list不包含该元素,则返回 -1。更正式地说,返回最低索引 i 这样 Objects.equals(o, get(i)) ,或 -1 如果没有这样的索引。
      指定者:
      indexOf 在接口 List<E>
      参数:
      o - 要搜索的元素
      返回:
      此list中指定元素第一次出现的索引,如果此list不包含该元素,则为 -1
    • indexOf

      public int indexOf(E  e, int index)
      返回此list中指定元素第一次出现的索引,从 index 向前搜索,如果未找到该元素,则返回 -1。更正式地说,返回最低索引 i 这样 i >= index && Objects.equals(get(i), e) ,或 -1 如果没有这样的索引。
      参数:
      e - 要搜索的元素
      index - 开始搜索的索引
      返回:
      此list中第一个元素在位置 index 或列表中出现的索引; -1 如果未找到该元素。
      抛出:
      IndexOutOfBoundsException - 如果指定索引为负
    • lastIndexOf

      public int lastIndexOf(Object  o)
      返回此list中指定元素最后一次出现的索引,如果此list不包含该元素,则返回 -1。更正式地说,返回最高索引 i 这样 Objects.equals(o, get(i)) ,或者 -1 如果没有这样的索引。
      指定者:
      lastIndexOf 在接口 List<E>
      参数:
      o - 要搜索的元素
      返回:
      此list中指定元素最后一次出现的索引,如果此list不包含该元素,则为 -1
    • lastIndexOf

      public int lastIndexOf(E  e, int index)
      返回此list中指定元素最后一次出现的索引,从 index 向后搜索,如果未找到该元素,则返回 -1。更正式地说,返回最高索引 i 这样 i <= index && Objects.equals(get(i), e) ,或者 -1 如果没有这样的索引。
      参数:
      e - 要搜索的元素
      index - 开始向后搜索的索引
      返回:
      此list中小于或等于 index 的元素最后一次出现的索引; -1 如果未找到该元素。
      抛出:
      IndexOutOfBoundsException - 如果指定索引大于或等于此list的当前大小
    • clone

      public Object  clone()
      返回此list的浅表副本。 (元素本身不会被复制。)
      重写:
      clone 在类 Object
      返回:
      此list的克隆
      参见:
    • toArray

      public Object [] toArray()
      返回一个数组,其中包含此list中按正确顺序(从第一个元素到最后一个元素)的所有元素。

      返回的数组将是“安全的”,因为此list不维护对它的引用。 (换句话说,这个方法必须分配一个新数组)。调用者因此可以自由修改返回的数组。

      此方法充当基于数组和基于集合的 API 之间的桥梁。

      指定者:
      toArray 在接口 Collection<E>
      指定者:
      toArray 在接口 List<E>
      返回:
      包含此list中所有元素的数组
      参见:
    • 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

      public E  get(int index)
      返回此list中指定位置的元素。
      指定者:
      get 在接口 List<E>
      参数:
      index - 要返回的元素的索引
      返回:
      此list中指定位置的元素
      抛出:
      IndexOutOfBoundsException - 如果索引超出范围 (index < 0 || index >= size())
    • set

      public E  set(int index, E  element)
      用指定元素替换此list中指定位置的元素。
      指定者:
      set 在接口 List<E>
      参数:
      index - 要替换的元素的索引
      element - 要存储在指定位置的元素
      返回:
      先前在指定位置的元素
      抛出:
      IndexOutOfBoundsException - 如果索引超出范围 (index < 0 || index >= size())
    • add

      public boolean add(E  e)
      将指定的元素附加到此list的末尾。
      指定者:
      add 在接口 Collection<E>
      指定者:
      add 在接口 List<E>
      参数:
      e - 要附加到此list的元素
      返回:
      true(由 Collection.add(E) 指定)
    • add

      public void add(int index, E  element)
      在此list中的指定位置插入指定元素。将当前位于该位置的元素(如果有)和任何后续元素向右移动(将其索引加一)。
      指定者:
      add 在接口 List<E>
      参数:
      index - 要插入指定元素的索引
      element - 要插入的元素
      抛出:
      IndexOutOfBoundsException - 如果索引超出范围 (index < 0 || index > size())
    • remove

      public E  remove(int index)
      移除此list中指定位置的元素。将任何后续元素向左移动(从其索引中减去一个)。返回从列表中删除的元素。
      指定者:
      remove 在接口 List<E>
      参数:
      index - 要删除的元素的索引
      返回:
      先前在指定位置的元素
      抛出:
      IndexOutOfBoundsException - 如果索引超出范围 (index < 0 || index >= size())
    • remove

      public boolean remove(Object  o)
      从此list中移除第一次出现的指定元素(如果存在)。如果此list不包含该元素,则它保持不变。更正式地说,删除具有最低索引 i 的元素,这样 Objects.equals(o, get(i)) (如果存在这样的元素)。如果此list包含指定元素,则返回 true(或者等效地,如果此list因调用而更改)。
      指定者:
      remove 在接口 Collection<E>
      指定者:
      remove 在接口 List<E>
      参数:
      o - 要从此list中删除的元素(如果存在)
      返回:
      true 如果这个列表包含指定的元素
    • addIfAbsent

      public boolean addIfAbsent(E  e)
      追加元素(如果不存在)。
      参数:
      e - 要添加到此list中的元素(如果不存在)
      返回:
      true 如果添加了元素
    • containsAll

      public boolean containsAll(Collection <?> c)
      如果此list包含指定集合的所有元素,则返回 true
      指定者:
      containsAll 在接口 Collection<E>
      指定者:
      containsAll 在接口 List<E>
      参数:
      c - 要检查此list中是否包含的集合
      返回:
      true 如果此list包含指定集合的所有元素
      抛出:
      NullPointerException - 如果指定的集合为空
      参见:
    • removeAll

      public boolean removeAll(Collection <?> c)
      从此list中移除指定集合中包含的所有元素。由于需要内部临时数组,因此这是此类中特别昂贵的操作。
      指定者:
      removeAll 在接口 Collection<E>
      指定者:
      removeAll 在接口 List<E>
      参数:
      c - 包含要从此list中删除的元素的集合
      返回:
      true 如果此list因调用而更改
      抛出:
      ClassCastException - 如果此list元素的类与指定集合不兼容 (optional)
      NullPointerException - 如果此list包含空元素并且指定的集合不允许空元素 (optional),或者如果指定的集合为空
      参见:
    • retainAll

      public boolean retainAll(Collection <?> c)
      仅保留此list中包含在指定集合中的元素。换句话说,从该列表中删除所有未包含在指定集合中的元素。
      指定者:
      retainAll 在接口 Collection<E>
      指定者:
      retainAll 在接口 List<E>
      参数:
      c - 包含要保留在此list中的元素的集合
      返回:
      true 如果此list因调用而更改
      抛出:
      ClassCastException - 如果此list元素的类与指定集合不兼容 (optional)
      NullPointerException - 如果此list包含空元素并且指定的集合不允许空元素 (optional),或者如果指定的集合为空
      参见:
    • addAllAbsent

      public int addAllAbsent(Collection <? extends E > c)
      将指定集合中尚未包含在此list中的所有元素追加到此list的末尾,按照它们由指定集合的迭代器返回的顺序。
      参数:
      c - 包含要添加到此list的元素的集合
      返回:
      添加的元素数量
      抛出:
      NullPointerException - 如果指定的集合为空
      参见:
    • clear

      public void clear()
      从此list中删除所有元素。此调用返回后列表将为空。
      指定者:
      clear 在接口 Collection<E>
      指定者:
      clear 在接口 List<E>
    • addAll

      public boolean addAll(Collection <? extends E > c)
      按照指定集合的迭代器返回的顺序,将指定集合中的所有元素追加到此list的末尾。
      指定者:
      addAll 在接口 Collection<E>
      指定者:
      addAll 在接口 List<E>
      参数:
      c - 包含要添加到此list的元素的集合
      返回:
      true 如果此list因调用而更改
      抛出:
      NullPointerException - 如果指定的集合为空
      参见:
    • addAll

      public boolean addAll(int index, Collection <? extends E > c)
      将指定集合中的所有元素插入此list,从指定位置开始。将当前位于该位置的元素(如果有)和任何后续元素向右移动(增加它们的索引)。新元素将按照指定集合的迭代器返回的顺序出现在该列表中。
      指定者:
      addAll 在接口 List<E>
      参数:
      index - 从指定集合中插入第一个元素的索引
      c - 包含要添加到此list的元素的集合
      返回:
      true 如果此list因调用而更改
      抛出:
      IndexOutOfBoundsException - 如果索引超出范围 (index < 0 || index > size())
      NullPointerException - 如果指定的集合为空
      参见:
    • forEach

      public void forEach(Consumer <? super E > action)
      从接口 Iterable 复制的描述
      Iterable 的每个元素执行给定的操作,直到处理完所有元素或操作引发异常。如果指定了迭代顺序,则将按迭代顺序执行操作。操作抛出的异常被转发给调用者。

      如果操作执行修改元素的底层源的副作用,则此方法的行为是未指定的,除非重写类已指定并发修改策略。

      指定者:
      forEach 在接口 Iterable<E>
      参数:
      action - 对每个元素执行的操作
      抛出:
      NullPointerException - 如果指定的操作为空
    • removeIf

      public boolean removeIf(Predicate <? super E > filter)
      从接口 Collection 复制的描述
      移除此集合中满足给定谓词的所有元素。迭代期间或由谓词抛出的错误或运行时异常将传递给调用者。
      指定者:
      removeIf 在接口 Collection<E>
      参数:
      filter - 为要删除的元素返回 true 的谓词
      返回:
      true 如果删除了任何元素
      抛出:
      NullPointerException - 如果指定的过滤器为空
    • toString

      public String  toString()
      返回此list的字符串表示形式。字符串表示形式由列表元素的字符串表示形式组成,这些元素按照其迭代器返回的顺序排列,括在方括号 ("[]") 中。相邻元素由字符 ", "(逗号和空格)分隔。元素按 String.valueOf(Object) 转换为字符串。
      重写:
      toString 在类 Object
      返回:
      此list的字符串表示形式
    • equals

      public boolean equals(Object  o)
      比较指定对象与此list是否相等。如果指定对象与此对象是同一个对象,或者如果它也是一个 List 并且 iterator 在指定列表上返回的元素序列与此list上的迭代器返回的序列相同,则返回 true。如果两个序列具有相同的长度并且序列中相同位置的对应元素是 equal ,则认为这两个序列是相同的。两个元素 e1e2 被认为是 equal 如果 Objects.equals(e1, e2)
      指定者:
      equals 在接口 Collection<E>
      指定者:
      equals 在接口 List<E>
      重写:
      equals 在类 Object
      参数:
      o - 要与此list进行相等比较的对象
      返回:
      true 如果指定的对象等于这个列表
      参见:
    • hashCode

      public int hashCode()
      返回此list的哈希码值。

      此实现使用 List.hashCode() 中的定义。

      指定者:
      hashCode 在接口 Collection<E>
      指定者:
      hashCode 在接口 List<E>
      重写:
      hashCode 在类 Object
      返回:
      此list的哈希码值
      参见:
    • iterator

      public Iterator <E > iterator()
      以正确的顺序返回此list中元素的迭代器。

      返回的迭代器提供构造迭代器时列表状态的快照。遍历迭代器时不需要同步。迭代器确实 NOT 支持 remove 方法。

      指定者:
      iterator 在接口 Collection<E>
      指定者:
      iterator 在接口 Iterable<E>
      指定者:
      iterator 在接口 List<E>
      返回:
      按正确顺序遍历此list中的元素的迭代器
    • listIterator

      public ListIterator <E > listIterator()
      返回此list中元素的列表迭代器(以正确的顺序)。

      返回的迭代器提供构造迭代器时列表状态的快照。遍历迭代器时不需要同步。迭代器确实NOT 支持removesetadd 方法。

      指定者:
      listIterator 在接口 List<E>
      返回:
      此list中元素的列表迭代器(按正确顺序)
    • listIterator

      public ListIterator <E > listIterator(int index)
      返回此list中元素的列表迭代器(以适当的顺序),从列表中的指定位置开始。指定的索引指示将由对 next 的初始调用返回的第一个元素。对 previous 的初始调用将返回指定索引减一的元素。

      返回的迭代器提供构造迭代器时列表状态的快照。遍历迭代器时不需要同步。迭代器确实NOT 支持removesetadd 方法。

      指定者:
      listIterator 在接口 List<E>
      参数:
      index - 从列表迭代器返回的第一个元素的索引(通过调用 next
      返回:
      列表中元素的列表迭代器(以适当的顺序),从列表中的指定位置开始
      抛出:
      IndexOutOfBoundsException - 如果索引超出范围 (index < 0 || index > size())
    • spliterator

      public Spliterator <E > 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

      public List <E > subList(int fromIndex, int toIndex)
      返回此list中介于 fromIndextoIndex 之间的部分的视图,不包括在内。返回列表受此list支持,因此返回列表中的更改会反映在此list中。

      如果支持列表(即此list)以除通过返回列表之外的任何方式修改,则此方法返回的列表的语义将变得未定义。

      指定者:
      subList 在接口 List<E>
      参数:
      fromIndex - subList 的低端点(包括)
      toIndex - 子列表的高端点(不包括)
      返回:
      此list中指定范围的视图
      抛出:
      IndexOutOfBoundsException - 对于非法端点索引值 (fromIndex < 0 || toIndex > size || fromIndex > toIndex)