Iterator中调用remove()前为什么必须先调用next()或previous()?

关于Iterator,本文不再赘述,推荐阅读这篇文章

  

下面针对本文主题发表个人观点:

  • remove()方法删除的是上次return的element(通过lastRet控制)

    而Iterator提供了由前向后next()及从后向前previous()两种遍历方式,在无法确定遍历方式的情况下,remove()方法是无法确定要删除哪一个element的,因此需调用next()或previous()记录上次return element的index,即lastRet。

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

            try {
                ArrayList.this.remove(lastRet);
                cursor = lastRet;
                lastRet = -1;
                expectedModCount = modCount;
            } catch (IndexOutOfBoundsException ex) {
                throw new ConcurrentModificationException();
            }
        }

 

  • 至于游标cursor,记录的是next element index,而add()方法只能add element至下一个位置(由前向后)且add() 本身会维护cursor,因此add()之前无需调用next()或previous()。
        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();
            }
        }

 

posted @ 2021-11-30 16:25  机械公敌  阅读(236)  评论(0编辑  收藏  举报