Module  java.base
软件包  java.util.concurrent

Class CopyOnWriteArrayList<E>

  • 参数类型
    E - 该列表中保存的元素的类型
    All Implemented Interfaces:
    SerializableCloneableIterable<E>Collection<E>List<E>RandomAccess


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

    这通常是太昂贵的,但是当遍历操作大大超过突变时,可能比替代方法有效,并且在不能或不想同步遍历时需要使用,但需要排除并发线程之间的干扰。 “快照”样式迭代器方法在创建迭代器的时候使用对数组状态的引用。 该数组在迭代器的生存期内永远不会改变,所以干扰是不可能的,迭代器保证不会抛出ConcurrentModificationException 自迭代器创建以来,迭代器将不会反映列表的添加,删除或更改。 元变化的迭代器操作本身( removeset ,并add )不被支持。 这些方法抛出UnsupportedOperationException

    允许所有元素,包括null

    内存一致性效果:与其他并发集合一样,在将对象放入CopyOnWriteArrayList happen-before之后的线程中的操作,随后从另一个线程中的CopyOnWriteArrayList访问或删除该元素。

    这个类是Java Collections Framework的成员。

    从以下版本开始:
    1.5
    另请参见:
    Serialized Form
    • 方法摘要

      所有方法  接口方法  具体的方法 
      Modifier and Type 方法 描述
      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每个元素执行给定的操作,直到所有元素都被处理或者动作引发异常。
      E get​(int index)
      返回此列表中指定位置的元素。
      int hashCode​()
      返回此列表的哈希码值。
      int indexOf​(E e, int 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​()
      返回此列表的字符串表示形式。
    • 构造方法详细信息

      • CopyOnWriteArrayList

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

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

        public CopyOnWriteArrayList​(E[] toCopyIn)
        创建一个包含给定数组的副本的列表。
        参数
        toCopyIn - 数组(该数组的副本用作内部数组)
        异常
        NullPointerException - 如果指定的数组为空
    • 方法详细信息

      • size

        public int size​()
        返回此列表中的元素数。
        Specified by:
        size接口 Collection<E>
        Specified by:
        size在接口 List<E>
        结果
        此列表中的元素数
      • isEmpty

        public boolean isEmpty​()
        如果此列表不包含元素,则返回 true
        Specified by:
        isEmpty在接口 Collection<E>
        Specified by:
        isEmpty在接口 List<E>
        结果
        true如果此列表不包含元素
      • contains

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

        public int indexOf​(Object o)
        返回此列表中指定元素的第一次出现的索引,如果此列表不包含元素,则返回-1。 更正式地,返回最低指数i ,使得Objects.equals(o, get(i)) ,或-1如果没有这样的索引。
        Specified by:
        indexOf在接口 List<E>
        参数
        o - 要搜索的元素
        结果
        此列表中指定元素的首次出现的索引,如果此列表不包含元素,则为-1
      • 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​(Object o)
        返回此列表中指定元素的最后一次出现的索引,如果此列表不包含元素,则返回-1。 更正式地说,返回满足i这样Objects.equals(o, get(i)) ,或-1,如果没有这样的指标。
        Specified by:
        lastIndexOf在接口 List<E>
        参数
        o - 要搜索的元素
        结果
        此列表中指定元素的最后一次出现的索引,如果此列表不包含元素,则为-1
      • lastIndexOf

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

        public Object clone​()
        返回此列表的浅层副本。 (元素本身不被复制。)
        重写:
        cloneObject
        结果
        这个列表的克隆
        另请参见:
        Cloneable
      • 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 - 如果指定的数组为空
      • 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
        Specified by:
        remove在接口 Collection<E>
        Specified by:
        remove在接口 List<E>
        参数
        o - 要从此列表中删除的元素(如果存在)
        结果
        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 - 如果指定的集合为空
        另请参见:
        contains(Object)
      • removeAll

        public boolean removeAll​(Collection<?> c)
        从此列表中删除指定集合中包含的所有元素。 这是一个特别昂贵的操作,因为需要一个内部的临时数组。
        Specified by:
        removeAll在接口 Collection<E>
        Specified by:
        removeAll在接口 List<E>
        参数
        c - 包含要从此列表中删除的元素的集合
        结果
        true如果此列表因呼叫而更改
        异常
        ClassCastException - 如果此列表的元素的类与指定的集合不兼容( optional
        NullPointerException - 如果此列表包含空元素,并且指定的集合不允许空元素( optional ),或者如果指定的集合为空
        另请参见:
        remove(Object)
      • retainAll

        public boolean retainAll​(Collection<?> c)
        仅保留此列表中包含在指定集合中的元素。 换句话说,从此列表中删除其中不包含在指定集合中的所有元素。
        Specified by:
        retainAll在接口 Collection<E>
        Specified by:
        retainAll在接口 List<E>
        参数
        c - 包含要保留在此列表中的元素的集合
        结果
        true如果此列表因呼叫而更改
        异常
        ClassCastException - 如果此列表的元素的类与指定的集合不兼容( optional
        NullPointerException - 如果此列表包含空元素,并且指定的集合不允许空元素( optional ),或者如果指定的集合为空
        另请参见:
        remove(Object)
      • addAllAbsent

        public int addAllAbsent​(Collection<? extends E> c)
        将指定集合中尚未包含在此列表中的所有元素按指定集合的迭代器返回的顺序附加到此列表的末尾。
        参数
        c - 包含要添加到此列表中的元素的集合
        结果
        添加的元素数量
        异常
        NullPointerException - 如果指定的集合为空
        另请参见:
        addIfAbsent(Object)
      • clear

        public void clear​()
        从列表中删除所有元素。 此呼叫返回后,列表将为空。
        Specified by:
        clear在接口 Collection<E>
        Specified by:
        clear在接口 List<E>
      • addAll

        public boolean addAll​(Collection<? extends E> c)
        按照指定集合的迭代器返回的顺序将指定集合中的所有元素追加到此列表的末尾。
        Specified by:
        addAll在接口 Collection<E>
        Specified by:
        addAll接口 List<E>
        参数
        c - 包含要添加到此列表中的元素的集合
        结果
        true如果此列表因呼叫而更改
        异常
        NullPointerException - 如果指定的集合为空
        另请参见:
        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 - 如果指定的集合为空
        另请参见:
        add(int,Object)
      • forEach

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

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

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

        public boolean removeIf​(Predicate<? super E> filter)
        说明从接口Collection复制
        删除满足给定谓词的此集合的所有元素。 在迭代或谓词中抛出的错误或运行时异常被转发给调用者。
        Specified by:
        removeIf在接口 Collection<E>
        参数
        filter - 一个谓词,为要删除的元素返回 true
        结果
        true如果有任何元素被删除
        异常
        NullPointerException - 如果指定的过滤器为空
      • replaceAll

        public void replaceAll​(UnaryOperator<E> operator)
        说明从界面List复制
        将该列表的每个元素替换为将该运算符应用于该元素的结果。 运营商抛出的错误或运行时异常被转发给呼叫者。
        Specified by:
        replaceAll在接口 List<E>
        参数
        operator - 操作员应用于每个元素
      • sort

        public void sort​(Comparator<? super E> c)
        说明从界面List复制
        根据指定的Comparator引发的顺序排列此列表。

        该列表中的所有元素必须使用指定的比较器相互比较(即, c.compare(e1, e2)不得为ClassCastException中的任何元素e1e2抛出ClassCastException )。

        如果指定的比较器是null则该列表中的所有元素都必须实现Comparable接口,并应使用元素' natural ordering '。

        该列表必须是可修改的,但不能调整大小。

        Specified by:
        sort在接口 List<E>
        参数
        c - 用于比较列表元素的Comparator A null值表示应使用元素' natural ordering '
      • toString

        public String toString​()
        返回此列表的字符串表示形式。 字符串表示由列表元素的字符串表示形式组成,按照它们由迭代器返回的顺序,包含在方括号( "[]" )中。 相邻元素由字符", " (逗号和空格)分隔。 元素将转换为字符串,如String.valueOf(Object)
        重写:
        toStringObject
        结果
        此列表的字符串表示形式
      • equals

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

        public Iterator<E> iterator​()
        以正确的顺序返回该列表中的元素的迭代器。

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

        Specified by:
        iterator在接口 Collection<E>
        Specified by:
        iterator在接口 Iterable<E>
        Specified by:
        iterator接口 List<E>
        结果
        在这个列表中的元素以适当的顺序迭代
      • listIterator

        public ListIterator<E> listIterator​()
        返回列表中的列表迭代器(按适当的顺序)。

        返回的迭代器在构建迭代器时提供列表状态的快照。 遍历迭代器时不需要同步。 该迭代器支持removeset或者add方法。

        Specified by:
        listIterator在接口 List<E>
        结果
        在列表中的元素的列表迭代器(按适当的顺序)
      • listIterator

        public ListIterator<E> listIterator​(int index)
        从列表中的指定位置开始,返回列表中的元素(按正确顺序)的列表迭代器。 指定的索引指示由初始调用next返回的第一个元素。 初始调用previous将返回具有指定索引的元素减1。

        返回的迭代器在构建迭代器时提供列表状态的快照。 遍历迭代器时不需要同步。 该迭代器支持removeset或者add方法。

        Specified by:
        listIterator在接口 List<E>
        参数
        index - 从列表迭代器返回的第一个元素的索引(通过调用 next
        结果
        在列表中的元素(按正确顺序)的列表迭代器,从列表中的指定位置开始
        异常
        IndexOutOfBoundsException - 如果索引超出范围( index < 0 || index > size()
      • subList

        public List<E> subList​(int fromIndex,
                               int toIndex)
        返回fromIndex (含)和toIndex之间的列表部分的视图。 返回的列表由此列表支持,因此返回的列表中的更改将反映在此列表中。

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

        Specified by:
        subList在接口 List<E>
        参数
        fromIndex - 子列表的低端点(含)
        toIndex - 子列表的高端点(排他)
        结果
        该列表中指定范围的视图
        异常
        IndexOutOfBoundsException - 对于非法端点索引值( fromIndex < 0 || toIndex > size || fromIndex > toIndex