`

java删除问题

 
阅读更多
在操作集合的过程中,有时要对不满足条件的集合中的元素进行删除
1,可以使用iterator进行迭代删除
2,使用集合本身的remove()方法
在用迭代器 处理集合对象时候
当在创建Iterator对象的时候会获取集合对象的modCount值
当在调用next()方法时候  会比较在创建此Iterator时获取的modCount与目前的modCount
如果这个2个modCount不相等,就会抛出ConcurrentModificationException
所以我们在用Iterator遍历集合的时候对集合中对象的add,remove要小心
再用get(index)获取元素时 也会先检查modCount的值
下面的执行操作会抛java.util.ConcurrentModificationException异常
因为
"当使用 fail-fast iterator 对 Collection 或 Map 进行迭代操作过程中尝试直接修改 Collection / Map 的内容时,即使是在单线程下运行, java.util.ConcurrentModificationException 异常也将被抛出。
Iterator 是工作在一个独立的线程中,并且拥有一个 mutex 锁。 Iterator 被创建之后会建立一个指向原来对象的单链索引表,当原来的对象数量发生变化时,这个索引表的内容不会同步改变,所以当索引指针往后移动的时候就找不到要迭代的对象,所以按照 fail-fast 原则 Iterator 会马上抛出 java.util.ConcurrentModificationException 异常。
所以 Iterator 在工作的时候是不允许被迭代的对象被改变的。但你可以使用 Iterator 本身的方法 remove() 来删除对象, Iterator.remove() 方法会在删除当前迭代对象的同时维护索引的一致性。"

public void removeYoungerFromMemberSheet() {   
        // 遍历一:这个处理会抛出java.util.ConcurrentModificationException
        for (Member member : memberSheet) {
            if (member.getAge() < 30) {
                memberSheet.remove(member);
            }
        }
       
        // 遍历二:这个处理也会抛出java.util.ConcurrentModificationException
        for (Iterator it = memberSheet.iterator(); it.hasNext();) {
            Member member = (Member) it.next();

            if (member.getAge() < 30) {
                memberSheet.remove(member);
            }
        }
       
        // 遍历三:这个处理调用Iterator 本身的方法 remove(),会正常执行
        for (Iterator it = memberSheet.iterator(); it.hasNext();) {
            Member member = (Member) it.next();

            if (member.getAge() < 30) {
                it.remove();
            }
        }
       
        // 遍历四:这个处理不依赖Iterator,也会正常执行
        for (int i=0;i<memberSheet.size();i++) {
            Member member = memberSheet.get(i);

            if (member.getAge() < 30) {
                memberSheet.remove(member);
            }
        }
    }


还有在处理的时候还可能会操作集合抛出java.lang.IllegalStateException异常的原因及其解决思路
Java中经常用到容器类,可以通过迭代器类Iterator来对集合中的元素进行迭代,从而对每个单独的元素进行某种操作,例如:

要删除集合中某一个不满足条件的元素,通过Iterator来删除,首先需要使用next方法迭代出集合中的元素,然后只需要调用remove方法即可。但是如果程序中不小心,造成对一次next方法执行迭代出一个元素,而执行了多于一次的remove删除操作,就会报java.lang.IllegalStateException异常。

其实,原因很显然了,迭代一次只能迭代出集合中的一个元素,而对该一次迭代执行了多次删除,显然就造成集合状态的不正常问题,抛出异常。

因为在迭代container集合中元素的过程中,首先通过it.next()迭代出一个字符串,然后mapIt里面是条件Map的一个迭代器实例,当调用this.passOneCondition(s, key, interval)判断不满足其中一个条件的时候,就删除集合container中对应的it迭代出的字符串。如果我们不执行break来终止条件Map的迭代,就会出现多次删除remove集合container中执行一次it.next()迭代出的字符串,所以抛出java.lang.IllegalStateException异常。 所以,在执行集合迭代操作过程中要谨慎小心,上面方法在执行完成remove之后,添加一个break;语句就行了:

分享到:
评论

相关推荐

    java删除本地文件.txt

    本文将详细介绍如何使用Java程序删除本地文件。这涉及到对Java标准库中的`java.io.File`类的理解与应用。 ### 一、理解`java.io.File` `java.io.File`是Java中用于表示文件路径名的抽象表示形式的类。它提供了一...

    java删除指定文件夹下文件

    以上就是使用Java删除指定文件夹下文件的基本步骤和关键知识点。通过`SimpleFileVisitor`,我们可以更灵活地控制文件和目录的删除操作,实现复杂的需求。在实际项目中,一定要注意异常处理和权限问题,确保代码的...

    java删除文件夹(删除文件)

    用JAVA 实现的删除文件(夹)程序,运行的时候,输入正确的文件夹路径,然后确定删除,文件夹路径不正确的时候不会做任何事情。

    java删除某个文件夹

    java递归删除整个文件夹,可以文件夹中所有的文件和子文件夹

    java 删除文件夹内指定前缀名字的所有文件

    在Java编程语言中,删除文件或文件夹是一项常见的任务,特别是在进行文件系统操作时。这里我们将深入探讨如何在Java中删除文件夹内指定前缀名字的所有文件。首先,我们需要了解`java.io.File`类,它是Java标准库中的...

    java 强制删除使用中的文件

    在Java编程中,有时我们需要处理一些特殊情况,例如删除一个正在被其他进程使用的文件。这个任务在常规情况下是不允许的,因为操作系统为了保护数据完整性,会阻止对正在被使用的文件进行删除操作。然而,某些场景下...

    java 删除某行和读写txt文件

    ### Java删除某行和读写TXT文件 在Java中,如果需要从文本文件中删除特定行,实际上并没有直接提供这样的方法。通常的做法是先将文件中的所有内容读取到内存中,然后根据需要过滤掉不需要的行,最后再将处理后的...

    JAVA删除PDF空白页

    在提供的压缩包文件"java删除PDF空白页"中,可能包含了实现这一功能的源代码示例,可以作为参考学习。通过阅读和理解这些代码,你可以更好地了解这两个库的具体使用方式,以及如何在实际项目中实现删除PDF空白页的...

    java创建和删除文件夹、文件

    ### Java 创建和删除文件夹、文件的相关知识点 在Java中,`java.io.File`类提供了创建和删除文件或目录的功能。下面将详细介绍如何利用这些功能实现文件和文件夹的基本操作。 #### 一、创建文件夹 创建文件夹是...

    java删除文件夹的代码

    在Java编程中,删除文件或文件夹是一项常见的操作。这里我们将深入探讨如何使用Java的`java.io.File`类来实现这一功能,特别是不使用递归而采用循环的方式。首先,让我们了解一下`File`类的基本概念。 `java.io....

    java程序实现文件夹删除

    在Java编程语言中,删除文件或文件夹是一个常见的任务,特别是在处理文件系统操作时。本文将深入探讨如何使用Java API来实现文件夹及其内容的删除功能。首先,我们需要理解Java中处理文件操作的核心类`java.io.File`...

    java创建和删除文件夹、文件.doc

    ### Java创建和删除文件夹与文件的知识点 #### 一、引言 在Java编程语言中,对文件系统的操作是一项非常基础且重要的功能。本文档将详细介绍如何使用Java来创建和删除文件夹以及文件,包括具体的实现代码和注意事项...

    java线程删除excel文件

    java线程删除excel文件java线程删除excel文件java线程删除excel文件

    Java删除不为空的目录

    Java删除不为空的目录,在图形化系统如Windows 和大部分的Linux 中删除一个目录是很容易的事,但是事实上并非如此,我们感到方便是因为操作系统帮我们完成了底层的删除工作,真正的删除工作是比较繁琐的。...

    java 删除文件夹下内容

    java 删除指定文件夹下所有文件,使用例子 DeleteFile.delAllFile&#40;path&#41;; path的值是D:/profile/123/

    java 删除指定目录下的文件

    在这个版本中,`Files.walkFileTree()`方法用于迭代目录树,从最深的子节点开始向上,这样在删除子目录时不会遇到已删除的父目录问题。我们使用`reverseOrder()`排序,以确保先删除子目录。然后,将`Path`对象转换为...

    java实现删除excel内容之间空行

    ### Java 实现删除 Excel 内容之间的空行 在日常工作中,我们经常需要处理大量的 Excel 文件,其中就包括对数据的清洗与整理。本篇文章将详细介绍如何使用 Java 实现删除 Excel 文件中的空行,这对于提高数据处理...

    java删除空文件夹

    java编写,递归删除某一指定目录下所有文件夹,空文件夹下空文件夹

    java批量删除列表内容

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

    MongoDB Java删除文档.pdf

    本教程将重点讨论如何使用Java删除MongoDB中的文档。 ### 1. 删除文档的基本概念 在MongoDB中,删除文档是通过`remove()`方法实现的。这个方法允许你指定一个查询条件,以便根据这些条件删除匹配的文档。如果未...

Global site tag (gtag.js) - Google Analytics