下面是我在项目中遇到的常见集合移除错误,刚开始自己也是犯错不断
为了方便叙述,先写一个测试类,然后加入测试,看看哪种情况你也存在问题,欢迎大家都来晒问题,并给出问题分析
public class TestList {
private List<Object> list = null;
@Before
public void init() {
list = new ArrayList<Object>();
for (int i = 0; i < 10; i++) {
list.add(new Object());
}
}
@After
public void print(){
System.out.println(list.size());
for(Object str:list){
System.out.println(str);
}
}
}
问题一:增强for循环移除list项,java.util.ConcurrentModificationException,不支持迭代移除
@Test
public void testForLoop01() {
/**
* 增强的for循环遍历时候产生问题
* java.util.ConcurrentModificationException
*/
for (Object str : list) {
list.remove(str);
}
}
问题二:size本身变化,i比较的值存在问题
@Test
public void testForLoop02(){
/**
* size在变化导致移除产生问题
*/
for(int i=0;i<list.size();i++){
list.remove(i);
}
}
问题三:问题依旧,list大小随着移除本身变化问题,
@Test
public void testForLoop03(){
int length=list.size();
for(int i=0;i<length;i++){
list.remove(i);
}
}
综上给出正确的方式
@Test
public void testForLoop04(){
int length=list.size();
for(int i=length-1;i>0;i--){
list.remove(i);
}
}
问题四:既然增强的for循环是调用的迭代器,存在问题是由于并发修改报的错,那么是否可以用并发工具集合避免这个问题,测试解决
@Test
public void testCurrentCollection(){
/**
* 最终并没有一个需要的结果,虽然不报异常
*/
list=new CopyOnWriteArrayList<Object>();
for (int i = 0; i < 10; i++) {
list.add(new Object());
}
for (Object str : list) {
list.remove(str);
}
}
分享到:
相关推荐
提供的jar包"NullCollection"可能是针对这个问题的一个解决方案,它可能包含了一个预编译的类或方法,可以直接用于移除集合中的空值。使用这样的库可以简化代码,提高效率,因为它已经处理了所有细节。为了在项目中...
在这个例子中,我们从List的最后一项开始遍历,如果满足删除条件,就移除该元素。由于是从后向前遍历,即使删除了元素,也不会影响前面未处理的元素。 然而,倒序遍历虽然可以解决跳过元素的问题,但删除操作的效率...
本文实例讲述了C#遍历集合与移除元素的方法。分享给大家供大家参考,具体如下: 如果用foreach,会造成被遍历的集合更改后带来异常问题。 此时,用for循环可有效的解决这个问题。 for(int i=0;i<List> newlists=new...
根据给定文件的信息,本文将详细介绍如何在Java的List集合中去除重复元素的三种方法:使用for循环、使用迭代器以及利用HashSet的特性。 ### 一、使用for循环去除重复元素 这种方法的基本思想是通过双重循环来遍历...
- **功能**:`Iterator`接口用于遍历集合中的元素,提供了一种方式来访问集合元素而无需暴露集合的具体实现。 - **方法**: - `hasNext()`:判断是否还有下一个元素。 - `next()`:返回集合中的下一个元素。 - `...
本压缩包"php-leetcode题解之移除元素.zip"显然是针对LeetCode平台上的一类问题——“移除元素”进行解答的集合。 “移除元素”的问题在实际编程中很常见,它可能涉及数组或链表等数据结构。例如,我们可能需要从...
- `void removeAll(Collection c)`:移除集合中出现在指定集合中的所有元素。 - `void retainAll(Collection c)`:保留集合中出现在指定集合中的元素,移除其他元素。 - `Object[] toArray()`:将集合转换为数组...
3. **删除元素**:从集合中移除特定元素。数组中删除元素后需要将后面的元素前移,链表中则只需改变相邻节点的链接关系。 4. **判断元素是否属于集合**:检查一个元素是否存在于集合中。在数组中,可以通过遍历数组...
- remove():移除集合中的元素。 - iterator():返回一个Iterator对象,用于遍历集合。 2. 批量操作: - containsAll():判断集合是否包含另一个集合的所有元素。 - addAll():将指定集合的元素添加到当前集合...
当需要从数组中移除某个元素时,通常需要采用一定的策略来实现这一操作,因为VB6的数组是静态的,不像某些现代编程语言那样支持动态调整大小或直接删除元素。以下是一些关于如何在VB6中删除数组元素的知识点: 1. *...
- 删除任意元素:`s.pop()` - 会随机移除并返回一个元素,若集合为空,将引发`KeyError`。 - 判断元素是否存在:`element in s` 或 `element not in s` 集合的内置函数: 1. `len(s)`:返回集合中元素的个数。 2. `...
- **迭代器**:Iterator接口用于遍历集合元素,提供了一种顺序访问集合元素的方式,而无需暴露集合的底层结构。迭代器的主要方法包括`hasNext()`、`next()`和`remove()`等。 #### 四、List List是Collection的一...
5. 新的集合元素删除操作 Java 8 提供了新的集合操作 API 和 Stream 来帮助我们解决这个问题。 5.1 Collection.removeIf() 新的 Collection Api removeIf(Predicate<? super E> filter) 提供了一种更简洁的使用 ...
而集合则允许动态地添加或移除元素,其大小可以随需求变化。 2. **类型约束**:数组需要在声明时指定元素类型,而集合通常使用`object`作为基础类型,允许存储任何对象,这提供了更大的灵活性。C# 2.0及以后版本...
在给出的代码中,`typedef struct pointer`定义了一个结构体,其中包含一个字符成员`dat`(用于存储集合元素)和一个指向下一个结构体的指针`link`(用于构建链表)。这种结构允许我们方便地存储和操作集合中的元素...
* E remove(int index) 移除集合中指定位置的元素 * E set(int index, E element) 用指定元素替换集合中指定位置的元素 * boolean add(E o) 向列表的尾部追加指定的元素 * boolean contains(Object o) 如果列表包含...
- **创建集合**:使用`set`或`unordered_set`的构造函数,可以初始化集合元素。 - **插入元素**:通过`insert`函数将元素添加到集合中。 - **删除元素**:`erase`函数用于从集合中移除元素。 - **集合运算**:...
7. 删除(Delete):从集合中移除指定元素。对于动态集合,哈希表或平衡二叉搜索树是较好的选择。 在完成课程设计时,你需要编写清晰的源代码,确保每个操作的正确性,并进行充分的测试。此外,分析运行结果,讨论...