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)