在学习编程的过程中,我觉得不止要获得课本的知识,更多的是解决问题的方法,面对新问题该怎么解决,这样我们才能走在最前方,我是达内的学员,感谢你对本博客的支持;(转载于http://www.jvtarena.com/)
这个问题的解决看上去非常简单。
我首先使用for each 语句进行删除。
for(SharedBoardSmsWrapper tmpSharedBoardSmsWrapper:source){
for(BlackNameListModel tmpBlackNameListModel:blackNameList){
if(tmpSharedBoardSmsWrapper.getSource().equals(tmpBlackNameListModel.getSource())){
source.remove(tmpSharedBoardSmsWrapper);
break;
}
}
}
非常简单的问题!我暗笑,
测试…
令我意外的是,这段代码居然抛出了异常
java.util.ConcurrentModificationException。
查看JDK6手册
public class ConcurrentModificationException
extends RuntimeException
当方法检测到对象的并发修改,但不允许这种修改时,抛出此异常。
例如,某个线程在 Collection 上进行迭代时,通常不允许另一个线性修改该 Collection。通常在这些情况下,迭代的结果是不确定的。如果检测到这种行为,一些迭代器实现(包括 JRE 提供的所有通用 collection 实现)可能选择抛出此异常。执行该操作的迭代器称为快速失败 迭代器,因为迭代器很快就完全失败,而不会冒着在将来某个时间任意发生不确定行为的风险。
注意,此异常不会始终指出对象已经由不同 线程并发修改。如果单线程发出违反对象协定的方法调用序列,则该对象可能抛出此异常。例如,如果线程使用快速失败迭代器在 collection 上迭代时直接修改该 collection,则迭代器将抛出此异常。
注意,迭代器的快速失败行为无法得到保证,因为一般来说,不可能对是否出现不同步并发修改做出任何硬性保证。快速失败操作会尽最大努力抛出 ConcurrentModificationException。因此,为提高此类操作的正确性而编写一个依赖于此异常的程序是错误的做法,正确做法是:ConcurrentModificationException 应该仅用于检测 bug。
Java中的For each实际上使用的是iterator进行处理的。而iterator是不允许集合在iterator使用期间删除的。而我在for each时,从集合中删除了一个元素,这导致了iterator抛出了ConcurrentModificationException。
看来只有老老实实使用传统的for循环了!
for(int i=0;i
SharedBoardSmsWrapper tmpSharedBoardSmsWrapper=source.get(i);
知识就是力量,别人学用知识来赚钱的成本低,在达内学习到编程是铸造梦想的地方,如果你喜欢编程,这里,有我们共同语言,共同的故事,共同的梦想!
(责任编辑:广州达内)
分享到:
相关推荐
在本例中,我们探讨了如何在Java中安全地删除一个集合的多个元素,特别是涉及`for each`循环和`Iterator`时的注意事项。 首先,让我们了解问题的背景。在尝试使用`for each`循环遍历并删除`source`集合中某些元素时...
- **合并**:`addAll()`可以将一个集合的元素添加到另一个集合中。 - **过滤**:Java 8引入的流API允许使用`filter()`进行条件过滤。 - **映射**:使用`map()`对集合中的每个元素应用函数。 - **并集、交集、...
在IT领域,集合比较是一项常见的任务,特别是在数据处理和编程中。本文将深入探讨如何比较两个集合,并关注在Java中使用List进行对比...在实际项目中,这种能力对于数据同步、日志分析、版本控制等多个场景都至关重要。
`List`接口定义了一个有序的、允许重复元素的集合,如`ArrayList`和`LinkedList`是它的实现类;`Set`接口则不允许重复元素,`HashSet`和`TreeSet`是常见的实现;`Queue`接口用于表示先进先出(FIFO)的数据结构,如`...
Java集合框架是Java编程语言中的一个重要组成部分,它提供了多种数据结构,如列表、队列、集、映射等,方便程序员存储和管理对象。本篇文章将详细讲解Java中的基本集合类ArrayList、LinkedList和Vector,以及HashSet...
首先,我们了解了集合的概念,它是一个可以存储多个对象的容器。集合框架的体系结构分为多个层次,包括接口和实现类。集合被分为List、Set和Map三大类,每种都有其特定的使用场景。例如,List适合存储有序的、可重复...
- `boolean add(Object o)`:向集合中添加一个元素。 - `boolean remove(Object o)`:移除集合中的某个元素。 - `int size()`:返回集合中元素的数量。 - `boolean isEmpty()`:检查集合是否为空。 - `boolean ...
自定义集合类的一个例子是,你可能想要创建一个支持优先级排序的队列,这时可以实现一个`PriorityQueue`类,基于最小堆数据结构实现,允许用户通过优先级插入和删除元素。 在实际应用中,自定义集合类可以提高代码...
对于集合类的迭代,每个集合类都应该提供一个迭代器(Iterator)实例,通过迭代器可以遍历集合中的所有元素,而且能够安全地在遍历过程中删除元素。 整个集合框架非常庞大,本文仅就部分概念和类进行了详细说明,...
`Map` 中的每个元素都由一个键和一个值组成。 - **HashMap**:基于哈希表实现,提供了快速的查找速度,但不保证键值对的顺序。 - **LinkedHashMap**:基于哈希表和双向链表实现,保持了元素的插入顺序。 - **...
集合是Java提供的一种数据结构,用于存储多个对象。Java集合框架包括接口(如List、Set、Queue)和实现这些接口的类(如ArrayList、HashSet、LinkedList等)。理解这些接口和类的特性和用法是Java开发者必备的基础...
通过以上介绍,我们了解到Java中的集合框架是一个强大且灵活的数据管理工具箱,它提供了多种不同类型的数据结构,以适应不同的应用场景。无论是处理大量的数据还是需要高效的查询性能,Java集合框架都能提供合适的...
- **Fail-fast**:当多个线程同时访问同一个集合时,如果其中有一个线程修改了集合的内容,则其他正在遍历该集合的线程可能会抛出`ConcurrentModificationException`异常。 - 实现机制:通过在集合内部维护一个修改...
为了方便遍历集合中的元素,Java集合框架提供了迭代器接口`Iterator`,它定义了遍历集合的基本方法:`hasNext()`判断是否还有下一个元素;`next()`返回集合中的下一个元素;`remove()`移除当前的元素。此外,对于`...
在这个"java电话本集合框架版"中,我们重点探讨的是如何利用Java的List接口及其实现类来构建一个功能丰富的电话簿系统。 首先,Java的List接口是集合框架的一部分,它定义了一个有序的元素集合,允许有重复的元素。...
同时,Collection接口提供了iterator()方法,使得可以通过迭代器遍历集合中的每个元素。Java SDK并未提供直接继承自Collection的类,而是通过其子接口如List和Set来实现具体的集合类。 List接口是Collection的一...
迭代器是遍历集合元素的主要方式,提供了hasNext()和next()方法来获取集合中的下一个元素。 10. **集合与数组的转换** 集合可以方便地转换为数组,反之亦然,这在处理数据时非常有用。 通过这些资料,你将能够...