Java 中的 CopyOnWriteArrayList 类

java programming java8object oriented programming

类声明

public class CopyOnWriteArrayList
   extends Object
implements List, RandomAccess, Cloneable, Serializable
  • CopyOnWriteArrayList 是 ArrayList 的一个线程安全变体,其中可以更改 ArrayList(添加、更新、设置方法)的操作会创建底层数组的克隆。

  • CopyOnWriteArrayList 用于基于线程的环境,其中读取操作非常频繁,而更新操作很少。

  • CopyOnWriteArrayList 的迭代器永远不会抛出 ConcurrentModificationException。

  • 自迭代器创建以来,对 CopyOnWriteArrayList 的任何类型的修改都不会在迭代过程中反映出来。

  • 迭代中不支持列表修改方法,如 remove、set 和 add。此方法将抛出 UnsupportedOperationException。

  • 可以将 null 添加到列表中。

CopyOnWriteArrayList 方法

以下是 CopyOnWriteArrayList 类中可用的重要方法列表。

Sr.No.
方法与说明
1
void add(int index, Object element)

在此列表中的指定位置索引处插入指定元素。如果指定索引超出范围(索引大小()),则抛出 IndexOutOfBoundsException。

2
boolean add(Object o)

将指定元素附加到此列表的末尾。

3
boolean addAll(Collection c)

将指定集合中的所有元素附加到此列表的末尾,按照指定集合的​​迭代器返回的顺序。如果指定集合为空,则抛出 NullPointerException。

4
boolean addAll(int index, Collection c)

从指定位置开始,将指定集合中的所有元素插入此列表。如果指定集合为空,则抛出 NullPointerException。

5
void clear()

从此列表中删除所有元素。

6
Object clone()

返回此 ArrayList 的浅表副本。

7
boolean contains(Object o)

如果此列表包含指定元素,则返回 true。更正式地说,当且仅当此列表包含至少一个元素 e,且满足 (o==null ? e==null : o.equals(e)) 时,才返回 true。

8
Object get(int index)

返回此列表中指定位置的元素。如果指定索引超出范围 (index = size()),则抛出 IndexOutOfBoundsException。

9
int indexOf(Object o)

返回此列表中第一次出现的指定元素的索引,如果 List 不包含此元素,则返回 -1。

10
int lastIndexOf(Object o)

返回此列表中最后一次出现的指定元素的索引,如果列表不包含此元素,则返回 -1。

11
Object remove(int index)

删除此列表中指定位置的元素。如果超出范围的索引(index = size()),则抛出 IndexOutOfBoundsException。

12
Object set(int index, Object element)

用指定元素替换此列表中指定位置的元素。如果指定索引超出范围 (index = size()),则抛出 IndexOutOfBoundsException。

13
int size()

返回此列表中的元素数量。

14
Object[] toArray()

返回一个包含此列表中所有元素的数组,且顺序正确。如果指定的数组为 null,则抛出 NullPointerException。


示例

以下程序说明了 ArrayList 支持的几种方法 −

import java.util.Iterator;
import java.util.concurrent.CopyOnWriteArrayList;
public class Tester {

   public static void main(String args[]) {
      // 创建数组列表
      CopyOnWriteArrayList al = new CopyOnWriteArrayList();
      System.out.println("Initial size of al: " + al.size());

      // 将元素添加到数组列表
      al.add("C");
      al.add("A");
      al.add("E");
      al.add("B");
      al.add("D");
      al.add("F");
      al.add(1, "A2");
      System.out.println("Size of al after additions: " + al.size());

      // 显示数组列表
      System.out.println("Contents of al: " + al);

      // 从数组列表中删除元素
      al.remove("F");
      al.remove(2);
      System.out.println("Size of al after deletions: " + al.size());
      System.out.println("Contents of al: " + al);

      try {
         Iterator iterator = al.iterator();
         while(iterator.hasNext()) {
            iterator.remove();
         }
      }catch(UnsupportedOperationException e) {
         System.out.println("Method not supported:");
      }
      System.out.println("Size of al: " + al.size());
   }
}

这将产生以下结果 −

输出

Initial size of al: 0
Size of al after additions: 7
Contents of al: [C, A2, A, E, B, D, F]
Size of al after deletions: 5
Contents of al: [C, A2, E, B, D]
Method not supported:
Size of al: 5

相关文章