`

JAVA在一个循环中删除一个列表中的元素

    博客分类:
  • java
 
阅读更多

JAVA 在一个循环中删除一个列表中的元素

思考下面这一段在循环中删除多个元素的的代码

ArrayList<String> list = new ArrayList<String>(Arrays.asList("a","b","c","d"));
for(int i=0;i<list.size();i++){
    list.remove(i);
}
System.out.println(list);

输出结果是:

[b,d]

在这个方法中有一个严重的错误。当一个元素被删除时,列表的大小缩小并且下标变化,所以当你想要在一个循环中用下标删除多个元素的时候,它并不会正常的生效。

你也许知道在循环中正确的删除多个元素的方法是使用迭代,并且你知道java中的foreach循环看起来像一个迭代器,但实际上并不是。考虑一下下面的代码:

ArrayList<String> list = new ArrayList<String>(Arrays.asList("a","b","c","d"));
for(String s:list){
    if(s.equals("a")){
        list.remove(s);
    }
}

它会抛出一个ConcurrentModificationException异常。

相反下面的显示正常:

ArrayList<String> list = new ArrayList<String>(Arrays.asList("a","b","c","d"));
Iterator<String> iter = list.iterator();
while(iter.hasNext()){
        String s = iter.next();
        if(s.equals("a")){
            iter.remove();
    }
}

.next()必须在.remove()之前调用。在一个foreach循环中,编译器会使.next()在删除元素之后被调用,因此就会抛出ConcurrentModificationException异常,你也许希望看一下ArrayList.iterator()的源代码。

分享到:
评论

相关推荐

    Java中增强for循环的实现原理和坑详解

    在增强for循环中,Java编译器会将其转换为一个普通的for循环,使用迭代器来遍历集合或数组。迭代器会在遍历过程中维护一个索引,指向当前要遍历的元素。这样,增强for循环可以简洁地遍历集合或数组,提高编程效率。 ...

    java集合类arraylist循环中删除特定元素的方法.docx

    ### Java集合类ArrayList循环中删除特定元素的方法 #### 背景与问题 在Java编程中,`ArrayList`是开发者最常使用的集合类之一。它实现了`List`接口,提供了动态数组的功能。在实际开发过程中,经常需要遍历`...

    java基础for循环练习题

    在"java基础for循环练习题"中,我们通常会遇到几种类型的`for`循环,包括基本的`for`循环、增强型`for`循环(也称为foreach循环),以及在数组和集合中的应用。下面我们将深入探讨这些知识点。 1. **基本的for循环*...

    Java实现循环链表

    用Java定义一个循环链表,实现链表的基本操作: 初始化*、获取头结点、添加新元素*、删除链表元素 、获取链表元素*、查找链表元素*、更新链表中某个元素、 判断链表是否为空、求链表元素个数、输出链表元素、清空...

    基于java的循环单链表

    与普通单链表不同,循环单链表的最后一个元素不是指向null,而是指向前一个元素,形成一个无限循环。这种数据结构允许我们高效地进行线性遍历和定位。 在Java中实现循环单链表,通常会涉及以下三个主要类: 1. ...

    java 版本循环链表

    循环链表是一种常见的数据结构,在计算机科学中广泛使用,它允许在链表的末端继续添加新的元素,从而形成一个环状结构。在这种数据结构中,最后一个节点的下一个节点不是空,而是指向第一个节点。 从提供的部分描述...

    java中循环删除list中元素的方法总结

    在Java编程中,当需要在循环中删除列表(List)中的元素时,需要注意一些关键点以避免潜在的问题。这里我们将详细讨论几种不同的循环遍历和删除元素的方法,以及它们的适用场景。 1. **常规for循环**: ```java for...

    基于java的循环双链表

    在这个测试类中,我们可以创建一个`CircularDoublyLinkedList`实例,然后调用接口方法插入、删除元素,同时检查结果是否符合预期。这通常会包括一些基本的单元测试,例如空链表操作、添加元素后的遍历、以及在不同...

    java for循环与增强for循环

    例如,在遍历一个包含Object类型的Set集合时,使用增强for循环可以简化代码: ```java Set&lt;Object&gt; set = new HashSet(); for (Object obj : set) { if (obj instanceof Integer) { int aa = (Integer) obj; // ....

    循环链表的经典实现(JAVA)

    循环链表是一种特殊的链式数据结构,它与普通链表的区别在于最后一个节点的指针不是指向NULL,而是指向链表的第一个节点,形成一个闭合的循环。这种数据结构在处理环形逻辑问题时非常有用,比如在算法中的Floyd判...

    java批量删除列表内容

    在Java编程中,批量删除列表内容是一个常见的需求,特别是在处理大量数据或进行数据清理时。本文将深入探讨如何实现这个功能,以及相关的Java批量处理技术。 首先,让我们了解Java中最常用的列表接口`List`,它提供...

    Java的循环单链表及其测试程序

    在Java编程中,循环单链表是一种特殊的数据结构,它扩展了传统的单链表概念,使得链表的最后一个元素指向第一个元素,形成了一个无尽的循环。这种数据结构在处理循环逻辑或者需要快速访问链表头尾的情况时非常有用。...

    Java 实例 - List 循环移动元素源代码+详细指导教程.zip

    本教程将深入讲解如何在Java中对List进行循环移动元素的操作,通过源代码实例和详细指导来帮助你掌握这一技能。 首先,我们需要理解Java中的List接口,它继承自Collection接口,常见的实现类有ArrayList和...

    Java 中删除线性表(如数组或列表)中指定区间的元素

    当需要从线性表中删除一个指定区间的元素时,需要理解如何操作数组或列表的数据结构以实现这一功能。下面将详细探讨如何在Java中进行线性表元素的区间删除。 首先,我们要了解Java中的两种主要线性数据结构:数组和...

    java过滤数组中重复元素,完整demo

    在这个主题中,我们将深入探讨如何使用ArrayList来过滤数组中的重复元素,并通过一个完整的Demo来演示这一过程。ArrayList是Java集合框架中的一种动态数组,它可以方便地添加、删除和修改元素。 首先,让我们了解...

    java集合类arraylist循环中删除特定元素的方法

    在Java中,当需要在ArrayList循环中删除特定元素时,应优先考虑使用迭代器。基于索引的删除虽然可行,但容易引发错误,特别是在多线程环境中。迭代器删除则更为安全,且遵循了Java集合框架的设计原则。因此,建议在...

    java队列实现(顺序队列、链式队列、循环队列)

    Java中的队列是一种数据结构,它遵循先进先出(FIFO)原则,即最先插入的元素将是最先被删除的。在Java中,队列的实现主要有三种:顺序队列、链式队列和循环队列。下面我们将详细探讨这三种队列的实现方式。 1. **...

    java中循环遍历删除List和Set集合中元素的方法(推荐)

    在Java编程中,遍历并删除集合(如List或Set)中的元素是一项常见的操作,但如果不正确地执行,可能会导致`ConcurrentModificationException`异常。这个异常通常在尝试修改正在迭代的集合时出现,因为Java的集合迭代...

    循环链表的java实现

    在Java中实现循环链表,我们需要定义一个节点类(Node)来存储数据和指向下一个节点的引用,同时在链表类(CircularLinkedList)中维护头节点和当前大小。以下是实现的关键点: 1. **节点类(Node)**:创建一个内部...

Global site tag (gtag.js) - Google Analytics