Java 中的 CopyOnWriteArrayList 类
类声明
public class CopyOnWriteArrayList extends Object implements List, RandomAccess, Cloneable, Serializable
CopyOnWriteArrayList 是 ArrayList 的线程安全变体,其中可以更改 ArrayList 的操作(添加、更新、设置方法)会创建底层数组的克隆。
CopyOnWriteArrayList 应该用于基于线程的环境中,在这些环境中读取操作非常频繁,而更新操作很少。
CopyOnWriteArrayList 的迭代器永远不会抛出 ConcurrentModificationException 异常。
对 CopyOnWriteArrayList 的任何类型的修改在迭代期间都不会反映出来,因为迭代器已创建。
在迭代中不支持 List 修改方法,例如 remove、set 和 add。此方法将抛出 UnsupportedOperationException 异常。
可以将 null 添加到列表中。
CopyOnWriteArrayList 方法
以下是 CopyOnWriteArrayList 类中可用的一些重要方法。
序号 | 方法及描述 |
---|---|
1 | void add(int index, Object element) 在此列表的指定位置 index 插入指定的元素。如果指定的 index 超出范围 (index size()),则抛出 IndexOutOfBoundsException 异常。 |
2 | boolean add(Object o) 将指定的元素追加到此列表的末尾。 |
3 | boolean addAll(Collection c) 将指定集合中的所有元素追加到此列表的末尾,追加顺序与指定集合的迭代器返回的顺序相同。如果指定的集合为 null,则抛出 NullPointerException 异常。 |
4 | boolean addAll(int index, Collection c) 将指定集合中的所有元素插入到此列表中,从指定位置开始。如果指定的集合为 null,则抛出 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 超出范围 (index size()),则抛出 IndexOutOfBoundsException 异常。 |
9 | int indexOf(Object o) 返回此列表中指定元素第一次出现的索引,如果此列表不包含此元素,则返回 -1。 |
10 | int lastIndexOf(Object o) 返回此列表中指定元素最后一次出现的索引,如果此列表不包含此元素,则返回 -1。 |
11 | Object remove(int index) 从此列表中删除指定位置的元素。如果 index 超出范围 (index size()),则抛出 IndexOutOfBoundsException 异常。 |
12 | Object set(int index, Object element) 将此列表中指定位置的元素替换为指定的元素。如果指定的 index 超出范围 (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[]) { // create an array list CopyOnWriteArrayList al = new CopyOnWriteArrayList(); System.out.println("Initial size of al: " + al.size()); // add elements to the array list 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()); // display the array list System.out.println("Contents of al: " + al); // Remove elements from the array list 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
广告