`
wangyanlong0107
  • 浏览: 504607 次
  • 性别: Icon_minigender_1
  • 来自: 沈阳
社区版块
存档分类
最新评论

【转】[J] 再次遭遇 Iterator 遍历 ArrayList 元素时执行删除操作

    博客分类:
  • java
 
阅读更多

已经是第二次碰到这个题目了。如果你以前没有专门的看这一块的话,很有可能你给出的答案是不正确的。

题目要求:

给出如下的程序,问如何删除 BBB 对应的元素,请把代码补充完整。

给出的代码框架:

[CODE]

import java.util.*;

class ArrayListTest {
public static void main(String[] args) {
   ArrayList<String> list = new ArrayList<String>();
   list.add("AAA");
   list.add("BBB");
   list.add("CCC");
   list.add("DDD");
  
   System.out.println(list);
  
   Iterator<String> it = list.iterator();
   while(it.hasNext()) {   
   // 需要实现的代码
   }
  
   System.out.println(list);
}
}

[CODE]

这块代码的意图很明显,通过 iterator的方式删除元素。

如果你给出的代码是这个样子:

String toDel = it.next();

if(toDel.equals("BBB")) {   
list.remove(toDel);   
}

那么恭喜你,答错了! 运行时会抛出异常:

Exception in thread "main" java.util.ConcurrentModificationException
        at java.util.AbstractList$Itr.checkForComodification(AbstractList.java:372)
        at java.util.AbstractList$Itr.next(AbstractList.java:343)
        at ArrayListTest.main(ArrayListTest.java:63)

抛出异常java.util.ConcurrentModification,为什么?这和 Iterator的内部实现有关系。有兴趣的话可以查看 Iterator 的源代码实现。
这里廖雪峰的一篇文章: Java源码分析:深入探讨Iterator模式 
供参考。

要怎么实现呢? 是这样的,再添加一条语句:

String toDel = it.next();

if(toDel.equals("BBB")) {
it.remove(toDel); // 需要添加这个语句  
list.remove(toDel);
   
}

调用 Iterator自身的remove()方法的目的是一并删除当前元素,它会自动同步expectedModCount和modCount的值。所以 checkForComodification()方法就不会抛出ConcurrentModificationException 异常了。

查看源代码,Iterator 中 remove() 方法的实现如下:

public void remove() {
    ...
    AbstractList.this.remove(lastRet);
    ...
    // 在调用了集合的remove()方法之后重新设置了expectedModCount:
    expectedModCount = modCount;
    ...
}

文章中也给出建议:

要确保遍历过程顺利完成,必须保证遍历过程中不更改集合的内容(Iterator的remove()方法除外),因此,确保遍历可靠的原则是只在一个线程中使用这个集合,或者在多线程中对遍历代码进行同步。

 

所以,根据题目要求,所要完成的完整代码为:

[CODE]

import java.util.*;

class ArrayListTest {
public static void main(String[] args) {
   ArrayList<String> list = new ArrayList<String>();
   list.add("AAA");
   list.add("BBB");
   list.add("CCC");
   list.add("DDD");
  
   System.out.println(list);
  
   Iterator<String> it = list.iterator();
   while(it.hasNext()) {   
    String toDel = it.next();

    if(toDel.equals("BBB")) {
    it.remove(toDel); // 需要添加这个语句  
     list.remove(toDel);   
    }
   }
  
   System.out.println(list);
}
}

分享到:
评论

相关推荐

    如何遍历ArrayList

    使用Iterator遍历ArrayList Iterator是Java集合框架中的一种接口,用于遍历集合中的元素。下面是一个使用Iterator遍历ArrayList的示例代码: ```java ArrayList arrayList = new ArrayList(); Iterator it = ...

    Iterator遍历过程中list删除导致异常

    当你想在迭代过程中删除元素时,应该使用`Iterator`的`remove()`方法,而不是直接调用集合的`remove()`方法。这样,`Iterator`会正确处理集合的内部状态,避免异常: ```java List&lt;String&gt; list = new ArrayList...

    struts2 iterator标签遍历二维数组

    在Struts2框架中,`&lt;s:iterator&gt;`标签被广泛用于遍历集合或数组等数据结构。本文将深入探讨如何使用Struts2中的`&lt;s:iterator&gt;`标签来遍历二维数组,并通过实例代码来具体说明其用法。 ### Struts2 Iterator标签 ##...

    模拟java ArrayList Iterator

    ArrayList提供了一种高效的方式来管理大量的元素,并且提供了迭代器(Iterator)来遍历这些元素,使得我们可以在不暴露底层实现细节的情况下访问和修改列表中的元素。这个资源的目的是通过模拟Java ArrayList的...

    Java Iterator接口遍历单列集合迭代器原理详解

    迭代器的实现原理:当遍历集合时,首先通过调用Collection集合的iterator()方法获得迭代器对象,然后使用hashNext()方法判断集合中是否存在下一个元素,如果存在,则调用next()方法将元素取出,否则说明已到达了集合...

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

    但是,需要注意的是,我们需要从后往前遍历ArrayList,以免引发 ConcurrentModificationException 异常。 ```java public static void main(String[] args) { ArrayList&lt;String&gt; list = new ArrayList(); list....

    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的...

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

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

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

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

    使用Enumeration和Iterator遍历集合类详解

    例如,`Vector` 和 `Hashtable` 这些旧的集合类仍然支持 `Enumeration`,但在新代码中,应尽量避免使用这些过时的集合类型,转而使用 `ArrayList`、`HashMap` 等现代集合类,它们默认支持 `Iterator`。 总结来说,`...

    Java使用Iterator迭代器遍历集合数据的方法小结

    通过Iterator迭代器,可以遍历ArrayList、Set、Map等各种集合类型。 1、使用迭代器遍历ArrayList集合 在Java中,ArrayList是一种常见的集合类型,可以使用Iterator迭代器来遍历其元素。下面是一个简单的实例: ``...

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

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

    Java集合使用 Iterator 删除元素

    因此,在使用Iterator遍历集合时,不能直接使用集合的remove方法删除元素,而应该使用Iterator的remove方法来删除元素。这是Java集合框架中的一个重要机制,可以避免ConcurrentModificationException异常的出现。 ...

    Arraylist例子代码 java

    可以通过增强for循环(foreach)或传统的迭代器方式遍历ArrayList中的元素。 ```java for (String s : list) { System.out.println(s); } Iterator&lt;String&gt; iterator = list.iterator(); while (iterator....

    java 中ArrayList迭代的两种实现方法

    以下是如何使用Iterator遍历ArrayList: ```java ArrayList&lt;String&gt; arrayList = new ArrayList(); arrayList.add("b"); arrayList.add("z"); arrayList.add("f"); arrayList.add("m"); System.out.println("以下...

    java使用ArrayList遍历及效率比较实例分析

    通过实验,我们可以看到,当元素数量较大(如1000000)时,使用索引遍历(第四种方法)的效率最高,其次是增强型for循环,然后是使用Iterator。当元素数量较小(如10)时,各种方法之间的差异变得微不足道,因为此时...

    遍历并批量删除容器中元素出现ConcurrentModificationException原因及处置

    在Java中,我们通常会使用`Iterator`来安全地遍历并修改集合,因为`Iterator`提供了`remove()`方法来删除当前迭代的元素。但如果你在不使用`Iterator`的情况下直接调用集合的`remove()`或其他修改方法,就会触发异常...

    使用Iterator模式将对象转成String.docx

    在上述描述中,提到了如何使用Iterator模式来解决在JSOM、XML、Java bean等对象操作时遇到的问题。通常,访问者模式用于访问并操作对象结构中的元素,但它在控制回调方面存在局限性,无法方便地跳过某些特定分支。...

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

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

    Java基础-ArrayList方法全解(上).pdf

    - 可以通过for-each循环,或者使用迭代器(Iterator)来遍历ArrayList的元素。 理解并熟练运用ArrayList的方法,对于编写高效的Java代码至关重要。在实际编程中,根据具体需求选择合适的方法,可以有效地管理集合...

Global site tag (gtag.js) - Google Analytics