当前位置: 首页 > 编程笔记 >

Java中的CopyOnWriteArrayList类

林绪
2023-03-14
本文向大家介绍Java中的CopyOnWriteArrayList类,包括了Java中的CopyOnWriteArrayList类的使用技巧和注意事项,需要的朋友参考一下

声明

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

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

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

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

  • 迭代中不支持列表修改方法,例如remove,set和add。此方法将引发UnsupportedOperationException。

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

CopyOnWriteArrayList方法

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

序号
方法与说明
1
void add(int index,Object element)

将指定的元素插入此列表中指定位置的索引处。如果指定的索引超出范围(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
voidclear()

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

6
Objectclone()

返回此ArrayList的浅表副本。

7
boolean contains(Object o)

如果此列表包含指定的元素,则返回true。更正式地说,当且仅当此列表包含至少一个元素(e == 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
intsize()

返回此列表中的元素数。

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("不支持的方法:");
      }
      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]
不支持的方法:
Size of al: 5
 类似资料:
  • 主要内容:1 CopyOnWriteArrayList的概述,1.1 写时复制,2 CopyOnWriteArrayList的原理,2.1 基本结构,2.2 构造器,2.3 写操作,2.4 读操作,3 CopyOnWriteArrayList的总结基于JDK1.8详细介绍了CopyOnWriteArrayList的底层源码实现,包括写操作、读操作、迭代操作等,并介绍了写时复制(COW)机制的原理。 1 CopyOnWriteArrayList的概述 public class CopyOnWrit

  • 问题内容: 当我遍历列表时,偶尔会得到一个。Google搜索通知我,这可能是因为我在迭代该列表时正在另一个线程中更改该列表,并且要使此问题消失,我应该使用…。 …除了我已经是。 显然,我在某处正在做一些 非常 愚蠢的事情。 是否有人对如何引发抛掷物有任何见识?如果有关系,我正在使用Java 5。 编辑: 由于我使用的转换器可能很重要,因此我以两种方式修改此列表: 在前面添加元素。() 使用subL

  • 问题内容: 我想排序CopyOnWriteArrayList。但是当我尝试运行以下代码时 它在扔unsorted operation exception。 提前致谢。 问题答案: 但是CopyOnWriteArrayList的ListIterator不支持remove,set或add方法。 解决方法:

  • 问题内容: 根据我的理解,并发集合类比同步集合更可取,因为并发集合类不会锁定完整的集合对象。相反,它们在收集对象的一小部分上锁定。 但是,当我检查的方法时,我们正在获取完整集合对象的锁。那为什么比返回的列表更好呢?我在方法中看到的唯一区别是,每次调用该方法时,我们都会创建该数组的副本。 问题答案: 对于写入(添加)操作,CopyOnWriteArrayList使用ReentrantLock并创建数

  • 问题内容: 当我尝试使用迭代器从CopyOnWriteArrayList删除元素时,出现异常。我注意到它已记录在案 不支持对迭代器本身进行元素更改操作(删除,设置和添加)。这些方法抛出UnsupportedOperationException。 (来自http://download.oracle.com/javase/6/docs/api/java/util/concurrent/CopyOnWr

  • 主要内容:文章目录,1.CopyOnWriteArrayList,2.CopyOnWriteArraySetCopyOnWrite的意思是,简单的说就是在对容器操作时,不是直接进行操作,而是先将容器复制一份,对新的容器操作后,再用新的容器覆盖原来的容器。 CopyOnWrite可以实现并发读操作,因为容器的写操作不会读当前容器造成影响。 CopyOnWrite的,不然n个写操作就会有n个容器副本,并且这n个副本会进行覆盖,最终只有1个副本的操作生效。 CopyOnWrite可以保证数据的,但是无