【集合相关】

在Java中,使用List迭代器遍历集合时,如果在遍历过程中添加新元素,由于迭代器的指针移动,新添加的元素可能不会在当前遍历中被访问。文章通过分析源码解释了这个问题的原因:add方法将元素添加到当前索引位置并移动指针,导致新元素在下一次迭代中被跳过。因此,如果需要遍历新添加的元素,需要重新开始遍历。
摘要由CSDN通过智能技术生成

使用List迭代器遍历集合时,添加新的元素没有被遍历的问题

public static void main(String[] args) {
        List<String> list = new ArrayList<>();
        list.add("张一");
        list.add("张二");
        list.add("张三");
        list.add("张四");
        
        //使用 list 迭代器遍历
        ListIterator<String> listit = list.listIterator();
        while (listit.hasNext()) {
            String str = listit.next();
            System.out.println(str);
            if (str.equals("张一")) {
                //添加操作后会修改下一次要访问的元素的索引,所以第一次遍历时会跳过新加的元素
                //想要遍历新加的元素,需要重新遍历一次
                listit.add("张一一");
            }
        }
   }

//List迭代器的next()方法
public E next() {
            checkForComodification(); //检查并发修改异常
            int i = cursor; //下一个要访问的元素的索引
            if (i >= size)
                throw new NoSuchElementException();
            Object[] elementData = ArrayList.this.elementData;
            if (i >= elementData.length)
                throw new ConcurrentModificationException();
            cursor = i + 1; //指针右移一位
            return (E) elementData[lastRet = i];
        }
//List迭代器add()方法
public void add(E e) {
            checkForComodification();
            try {
                int i = cursor; //下一个要访问的元素的索引
                ArrayList.this.add(i, e); //添加元素
                cursor = i + 1; //指针右移一位
                lastRet = -1;
                expectedModCount = modCount;
            } catch (IndexOutOfBoundsException ex) {
                throw new ConcurrentModificationException();
            }
        }

通过分析源码可以发现,当使用next()方法获取到“张一”(0索引位置)这个元素后,指针会指向下一个元素“张二”(1索引位置)。当使用add()方法添加新元素“张一一”时,会在1索引位置添加,添加结束时会也会把指针右移一位,指向下一个元素“张二”(2索引位置),所以新添加的元素不会在下轮遍历时被访问,遍历完的结果好像新元素没有被添加到集合一样。
add方法执行过程

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值