CopyOnWriteArrayList是ArrayList的一个线程安全的变体,即可在并发中使用。而它的可变操作都是通过对ArrayList中存储的数组通过一次新的复制来实现的。
首先讲一下它的用处,如下面的代码:
List<String> list =new ArrayList<String>();
list.add("4");
list.add("5");
list.add("6");
Iterator<String> iter = list.iterator();
while(iter.hasNext()){
String o = iter.next();
System.out.println(o);
list.remove(o);//or list.add("adf");等操作
}
执行会抛出异常:java.util.ConcurrentModificationException
当然如果吧 list.remove(o);换成iter.remove();是没问题的!但是iter却没有add方法。
下面说一下如何使用CopyOnWriteArrayList在遍历集合过程中修改元素。代码如下
List<String> list =new CopyOnWriteArrayList<String>();
list.add("4");
list.add("5");
list.add("6");
Iterator<String> iter = list.iterator();
while(iter.hasNext()){
String o = iter.next();
System.out.println(o);
list.remove(o);//or list.add("adf");等操作
}
注:1.上面已经说过,CopyOnWriteArrayList操作是很消耗资源的,使用条件是,当集合中需要修改的元素数远小于集合大小时。
2.因为CopyOnWriteArrayList在做迭代之前是做了一份“快照”,所以此时的iter是不可变的,也就是说如果在此遍历中调用iter.remove();会抛出异常:java.lang.UnsupportedOperationException。
分享到:
相关推荐
遍历List对象集合是日常开发中常见的操作,这里我们将详细介绍三种遍历List的方法,并探讨它们的性能特点和适用场景。 ### 第一种:迭代器(Iterator)遍历 ```java for (Iterator<A> it = list.iterator(); it....
如果在遍历过程中删除元素"a",由于ArrayList的删除操作会移动后面的元素来填补空位,原本指向元素"b"的游标在删除操作后实际上会指向元素"c"。这就导致元素"b"无法被遍历到,而"b"和"c"之间的关系并未改变,导致...
在Java编程中,遍历并删除集合(如List或Set)中的元素是一项常见的操作,但如果不正确地执行,可能会导致`ConcurrentModificationException`异常。这个异常通常在尝试修改正在迭代的集合时出现,因为Java的集合迭代...
另外,CopyOnWriteArrayList由于其"读写分离"的思想,遍历和修改操作分别作用在不同的list容器,所以在使用迭代器进行遍历时候,不会抛出ConcurrentModificationException异常。 CopyOnWriteArrayList容器的缺点是...
如果在多线程环境中操作集合,需要注意线程安全问题,可能需要使用`CopyOnWriteArrayList`或其他同步容器,或者对比较过程进行同步控制。 通过理解并熟练运用这些方法,我们可以有效地比较和操作两个List集合,...
在 Java 中,对 list 进行遍历和删除操作是一种常见的需求。本文将介绍 Java list 利用遍历进行删除操作的 3 种方法,并通过示例代码对每种方法进行详细的解释。 方法一:使用 for 循环 在使用 for 循环遍历 list ...
通过深入学习和实践这些例子,你将能够熟练地在Java List中进行元素替换操作,无论是单个元素还是整个列表。同时,理解何时使用线程安全的实现以及如何在多线程环境中处理元素替换也是非常重要的。希望这份源代码和...
在Java编程语言中,集合框架是处理对象组的重要工具,它提供了一种高效、灵活的方式来存储和操作数据。本文将深入探讨Java中的集合操作,并结合PPT(虽然这里没有提供具体的PPT内容,但通常这样的资源会包含示例、...
`List`的主要特点是可以通过索引访问元素,同时也支持插入、删除等操作。 ### List的主要实现类 1. **ArrayList**:基于动态数组实现,线程不安全,但提供了高效的随机访问能力。 2. **LinkedList**:基于双向链表...
3. 插入和删除:List在插入和删除元素时,内部会进行调整,而数组需要移动大量元素。 4. 类型:List接口是Java集合框架的一部分,而数组是Java的基本特性。 在CnToSpell.java这个文件中,可能实现了一个将中文字符...
- remove()方法删除指定索引处的元素,而LinkedList的removeFirst()和removeLast()分别删除首元素和尾元素。 6. **ArrayList与LinkedList的并发问题** - ArrayList非线程安全,多线程环境下操作可能导致数据不...
在这个场景中,我们使用ArrayList来实现用户信息的添加、删除、更新和查询功能,这在实际的业务开发中非常常见,特别是对于小型数据集的操作。 **一、添加用户信息** 添加用户信息是通过调用ArrayList的`add()`...
当有元素需要被添加、删除或修改时,它并不会直接在原列表上进行操作,而是创建一个新的数组,将原数组的内容复制到新数组,然后在新数组上进行修改,并将原引用指向新数组。这种设计使得在遍历列表时,即使有其他...
Java中的`java.util.List`接口是集合框架的重要组成部分,它扩展了`Collection`接口,并引入了一些特定于列表的特性,如有序性、可重复性以及对元素的索引访问。这篇博客将深入探讨`List`接口及其常用实现类,如`...
Java集合框架是Java编程语言中不可或缺的一部分,它为开发者提供了数据结构和算法的实现,使得在处理对象集合时更加高效和便捷。在这个“java资料各种集合”中,我们可以期待找到关于Java集合框架的各种深入讲解和...
2. 实例操作:插入元素、删除元素、查找元素、遍历List等。 三、Set接口与HashSet类 1. Set接口:Set接口同样继承自Collection,但不允许有重复元素。HashSet是Set接口的一个实现,它不保证元素的顺序,且允许使用...
在Java编程语言中,`List.removeAll()`方法是一个非常实用的函数,它允许我们从列表中一次性移除所有指定元素。这个方法是集合框架的一部分,它提供了高效的方式来进行元素的删除操作。本文将深入探讨`removeAll()`...
通过解决这些练习题,你将能够更好地了解容器的基本操作,如添加、删除、查找元素,以及如何根据具体需求选择合适的容器类型。 1. ArrayList:ArrayList是一个基于数组实现的动态大小列表。它提供了快速的随机访问...