Java集合iterator.remove问题

Java集合的问题

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

public class MyCollectionDemo5 {
    public static void main(String[] args) {
        ArrayList<String> list = new ArrayList<>();
        list.add("b");
        list.add("b");
        list.add("c");
        list.add("d");
        list.add("e");

        Iterator<String> iterator = list.iterator();
        while (iterator.hasNext())
        {
            String s = iterator.next();
            if ("b".equals(s))
            {
                //指向谁,就删除谁
                iterator.remove();
            }
        }
        System.out.println(list);

    }

}

结果:[c, d, e]

已知:当调用next方法的时候,向下移动指针,并且返回指针指向的元素
remove方法删除的元素是指针指向的元素。

当第一次执行String s = iterator.next();的时候,调用了next,返回指针指向的元素(0索引的b),并且把指针指向了1索引的b
如图:

img

因为remove方法删除的元素是指针指向的元素,此时指向的是1索引的b,那删掉的不就是1索引的b吗 想知道0索引的b是什么时候删掉的

我知道我的理解有问题 我也调试过了 但是还是不理解 求解答 谢谢

指针一开始不指向0,调用了next才指向0

其实你都调试过了应该一眼就能看出问题,点开迭代器的源码看一眼,remove方法是根据上一个元素来进行删除的

为了方便你看 把源码给你贴出来

        public E next() {
            checkForComodification();
            try {
                int i = cursor;
                E next = get(i);
                lastRet = i;
                cursor = i + 1;
                return next;
            } catch (IndexOutOfBoundsException e) {
                checkForComodification();
                throw new NoSuchElementException();
            }
        }

        public void remove() {
            if (lastRet < 0)
                throw new IllegalStateException();
            checkForComodification();

            try {
                AbstractList.this.remove(lastRet);
                if (lastRet < cursor)
                    cursor--;
                lastRet = -1;
                expectedModCount = modCount;
            } catch (IndexOutOfBoundsException e) {
                throw new ConcurrentModificationException();
            }
        }

if ("b".equals(s))
            {
                //指向谁,就删除谁
                iterator.remove();
            }

remove()方法是:从底层集合中移除此迭代器返回的最后一个元素(即最近一此调用next()方法时指向的元素,对应题目的代码则是元素值等于"b"的两个元素,所以两个值是"b"的元素都被移走)。 每次调用next()时,只能调用此方法一次。
根据链接:
Java迭代器Iterator的remove()方法 - Chen洋 - 博客园
Java Iterator(迭代器) | 菜鸟教程

文章:Iterator中的remove()方法详解-Java 中也许有你想要的答案,请看下吧