`

ArrayList遍历的同时删除

    博客分类:
  • java
 
阅读更多

 

ArrayList<String> list = new ArrayList<String>();   
  list.add("one");   
  list.add("two");   
  list.add("two");   
  list.add("two");   
  list.add("two");   
  for(int i=0;i<list.size();i++){   
     if(list.get(i).equals("two")){   
          list.remove(i);   
               }   
     }   
  System.out.println(list);

输出结果:[one, two, two]. 这是因为虽然下标值没变,但是list内部元素已经变化了。

 

 

ArrayList<String> list = new ArrayList<String>();
        list.add("one");
        list.add("two");
        list.add("two");
        list.add("two");
        list.add("two");
        for(String s:list){
            if(s.equals("two")){
                list.remove(s);
            }
        }
        System.out.println(list);

输出结果:java.util.ConcurrentModificationException异常。

当方法检测到对象的并发修改,但不允许这种修改时,就抛出此异常。
注意,此异常不会始终指出对象已经由不同线程并发修改。如果单线程发出违反对象协定的方法调用序列,则该对象可能抛出此异常。如:本例中的迭代删除。

执行该操作的迭代器称为快速失败迭代器,因为迭代器很快就完全失败,而不会冒着在将来某个时间任意发生不确定行为的风险。

 

ArrayList<String> list = new ArrayList<String>();
        list.add("one");
        list.add("two");
        list.add("two");
        list.add("two");
        list.add("two");
        Iterator<String> iter = list.iterator();
        while(iter.hasNext()){
            String s = iter.next();
            if(s.equals("two")){
                iter.remove();
            }
        }
        System.out.println(list);

输出:[one]

Iterator 是工作在一个独立的线程中,并且拥有一个 mutex 锁。 Iterator 被创建之后会建立一个指向原来对象的单链索引表,当原来的对象数量发生变化时,这个索引表的内容不会同步改变,所以当索引指针往后移动的时候就找不到要迭代的对象,所以按照 fail-fast 原则 Iterator 会马上抛出 java.util.ConcurrentModificationException 异常。
所以 Iterator 在工作的时候是不允许被迭代的对象被改变的。但你可以使用 Iterator 本身的方法 remove() 来删除对象, Iterator.remove() 方法会在删除当前迭代对象的同时维护索引的一致性。
  

 

 

分享到:
评论

相关推荐

    Java ArrayList遍历修改代码实例解析

    然而,在遍历 ArrayList 时,如果需要删除某些元素,可能会遇到 ConcurrentModificationException 异常。今天,我们将讨论如何正确地遍历和修改 ArrayList。 遍历 ArrayList 的正确方法 在遍历 ArrayList 时,不能...

    java arrayList遍历的四种方法及Java中ArrayList类的用法

    - 遍历ArrayList时,使用迭代器通常比索引遍历效率更高,因为迭代器避免了对size()的重复计算。 - 对于大规模数据的增删操作,考虑使用LinkedList,因为ArrayList的插入和删除操作在中间位置时效率较低。 了解并...

    jni操作arraylist对象

    ArrayList通过数组来存储元素,因此可以快速访问任意位置的元素,但插入和删除元素时可能需要移动其他元素,这可能导致性能下降。 在JNI中操作ArrayList,我们需要做以下几步: 1. **创建JNI函数**:在C/C++代码中...

    java迭代器模式实现正反向遍历

    - `ConcreteAggregate`类使用`LinkedList`作为其内部数据结构,因为`LinkedList`提供了快速的插入和删除操作,这在迭代器模式中可能不那么关键,但在其他场景下可能是有益的。 - 在主类`Client`中,首先创建了一个`...

    C# 集合对象遍历性能测试

    ArrayList的优点在于其灵活性,可以存储任意类型的对象,但缺点是插入和删除元素时可能需要进行大量的元素移动,这在遍历过程中会影响性能。 其次,`Dictionary, TValue&gt;`是一个键值对的集合,基于哈希表实现。它的...

    java集合类遍历的同时如何进行删除操作.docx

    在Java编程中,集合类遍历的同时进行删除操作是一个常见的需求,但如果不正确地执行,可能会导致`ConcurrentModificationException`。这个问题主要出现在迭代器正在遍历集合时,集合本身被修改的情况。以下是对这个...

    java数组遍历 删除remove(示例代码)

    总结来说,这个示例展示了如何在Java中创建一个包含自定义对象的ArrayList,如何向ArrayList中添加和删除元素,以及如何安全地遍历ArrayList并访问其元素。在实际开发中,了解这些基本操作对于处理动态数据集至关...

    jstl 遍历_jstl遍历_

    `&lt;c:forEach&gt;`标签用于遍历任何可迭代的数据源,如ArrayList、LinkedList、HashMap等。其基本语法如下: ```jsp &lt;!-- 在这里处理每项元素 --&gt; ``` - `items`:指定要遍历的集合或数组。 - `var`:定义一个变量...

    JavaScript 实现基础 ArrayList 功能

    首先,我们需要创建一个ArrayList类,这个类将包含添加、删除、查找、更新和遍历元素等基本操作。由于JavaScript的Array对象已经提供了这些功能,我们可以通过扩展Array原型来创建ArrayList。 ```javascript ...

    Java中ArrayList的removeAll方法详解

    同时,优化的方法也使用了迭代器遍历ArrayList中的元素,而不是使用循环遍历。这也提高了方法的执行速度。 ArrayList的removeAll方法是一个非常有用的集合操作方法,但是需要 thận重使用,以免导致性能问题。在...

    ArrayList类操作程序实例

    六、遍历ArrayList 1. for-each循环:`for (E e : list) { ... }` 2. Iterator迭代器:`Iterator&lt;E&gt; iterator = list.iterator(); while (iterator.hasNext()) { E e = iterator.next(); ... }` 七、ArrayList的...

    ASP .NET - ArrayList对象

    ArrayList对象是一个非常基础且灵活的集合类,它允许程序员在运行时添加、删除和访问元素,而无需预先确定数组的大小。下面将详细介绍ArrayList对象的特性、操作方法以及在实际开发中的应用。 1. ArrayList对象的...

    day09-ArrayList集合&学生管理系统.pdf

    通过上述知识点的学习,我们可以掌握ArrayList集合的基本使用,包括创建集合、添加、删除、修改以及遍历集合元素等操作,能够针对具体的需求来编写相应的Java程序代码。此外,使用泛型来约束集合中的数据类型是提高...

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

    **错误的遍历删除方式** 错误的示例代码如下: ```java Set&lt;CheckWork&gt; set = this.getUserDao().getAll().get(0).getActionCheckWorks(); for (CheckWork checkWork : set) { if (checkWork.getState() == 1) { ...

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

    然而,在遍历过程中直接修改`ArrayList`(如删除元素)可能会引发`IndexOutOfBoundsException`等异常。 #### 错误示例分析 以下是一种常见的错误操作方式: ```java for (int i = 0; i (); i++) { if (list.get...

    Java自学视频教程-JavaSE基础-常用API-07、ArrayList案例:遍历删除、存对象、元素搜索.mp4

    Java是一种编程语言,被特意设计用于互联网的分布式环境。Java具有类似于C++语言的“形式和感觉”,但它要比C++语言更易于使用,而且在编程时彻底采用了一种“以对象为导向”的方式。 使用Java编写的应用程序,既...

    学生管理系统(使用ArrayList)

    5. 显示所有学生信息:遍历ArrayList并打印每个学生的属性。 6. 学生排序:使用Collections工具类的`sort()`方法,可以对ArrayList进行排序,如按照学号升序排列。 在实践中,为了提高代码的可读性和可维护性,我们...

    ArrayList的实现原理

    - **遍历**:遍历ArrayList的元素效率高,因为可以通过索引直接访问。 总结来说,ArrayList是Java中一个重要的动态数组实现,它的优点在于提供了高效的随机访问和修改,但在插入和删除元素时,特别是当元素位于...

    从原码解析ArrayList

    在多线程环境下,如果一个线程正在遍历ArrayList,而另一个线程同时修改了ArrayList的结构(例如添加或删除元素),可能会导致两种不同的行为。"安全失败"允许遍历继续,但返回的结果可能不正确,因为遍历的是...

Global site tag (gtag.js) - Google Analytics