javase-collection-210619-01

这篇博客探讨了在Java集合框架中,使用迭代器进行元素删除时的注意事项。主要内容包括:1) 使用集合的remove()方法删除元素会导致迭代器报错,需重新获取迭代器;2) 正确做法是使用迭代器自身的remove()方法,它会自动更新迭代器和集合状态。通过示例代码展示了这两种情况的区别。
摘要由CSDN通过智能技术生成

javase-collection-210619-01

  • Collection------remove()

在集合中使用remove()方法,会使得集合的结构发生改变,如果此时迭代器还是原来的那个,会报错

例子:CollectionTest02.java

1. 如果使用集合的remove()方法进行删除,要通知迭代器更新,否则报错
2. 或者使用迭代器的remove()方法进行删除

CollectionTest01.java

package bgy_test_2161901;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;

public class CollectionTest01 {
    public static void main(String[] args) {

        // 1. 创建集合
        Collection c = new ArrayList();

        /*
            在这里获取迭代器,报异常  java.util.ConcurrentModificationException
            此时的迭代器,指向的是集合中没有元素状态下的迭代器
            注意:集合中结构只要发生变化,迭代器必须重新获取
                 当集合结构发生了改变,迭代器没有重新获取,调用next()方法时,报上面的异常
        */
//        Iterator it = c.iterator();


        c.add("a");
        c.add("b");
        c.add("c");

        // 正确方法,在这里调用
        // 获取迭代器Iterator
        Iterator it = c.iterator();

        while (it.hasNext()) {
            // 编写代码 next() 时,返回结果必须是Object
            Object obj = it.next();
            System.out.println(obj);
        }
    }
}

CollectonTest02.java

package bgy_test_2161901;

/*
    集合元素的remove方法
        当集合结构发生改变时,迭代器必须重新获取,
        如果还用老的迭代器会抛出异常:java.util.ConcurrentModificationException

    boolean remove(Object o)
    从该集合中删除指定元素的单个实例(如果存在)(可选操作)。
    更正式地,删除元素e ,使得(o==null ? e==null : o.equals(e)) ,如果该集合包含一个或多个这样的元素。
    如果此集合包含指定的元素(或等效地,如果此集合由于调用而更改),则返回true 。

    1.
        在迭代集合元素的过程中,不能调用集合对象的remove()方法,删除元素
            即 c.remove(o);
            迭代过程中不能这样弄,会抛出异常java.util.ConcurrentModificationException
            当然你可以通过把迭代器更新: 即 it2 = c.iterator();

    2.
        在迭代集合元素的过程中,一定要使用迭代器Iterator 的 remove() 方法,删除元素
            即:
                iterator.remove();      // 迭代器指向的当前的元素
        不要使用集合自带的remove方法来删除
 */

import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;

public class CollectionTest02 {
    public static void main(String[] args) {

        // 1. 创建集合
        Collection c = new ArrayList();

        // 2. 获取迭代器 it1
        Iterator it1 = c.iterator();

        // 3. 添加元素
        c.add("a");
        c.add("b");
        c.add("c");

        Iterator it2 = c.iterator();

        // 5. 迭代
        while (it2.hasNext()) {
            Object o = it2.next();

            /*
                1.

                c.remove(o)  直接通过集合删除元素,没有通知迭代器(迭代器快照和原集合状态不同)
                循环下一次的时候如果没有重新获取迭代器,会抛异常

                重新获取迭代器可以解决这个问题
            */
//            c.remove(o);
//            // 重新获取迭代器it2
//            it2 = c.iterator();
//            System.out.println(c);


            /*
                2.

                it2.remove()  删除的定是迭代器指向的当前的元素
                使用迭代器来删除元素
                迭代器删除元素时,会自动更新迭代器,并且更新集合
             */
            it2.remove();
            System.out.println(c);

        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值