看源码1. ArrayList中的Iterator实现

ArrayList的包里面的关于 Iterator 的实现源码:
/**
     * An optimized version of AbstractList.Itr
     */
    private class Itr implements Iterator<E> {
        int cursor;       // 下一个元素的下标
        int lastRet = -1; // 最后一个返回的下标,如果没有,返回 -1
        int expectedModCount = modCount;

        Itr() {}//默认的无参构造方法

        public boolean hasNext() {
            return cursor != size;//cursor 未到达线性表的末尾
        }

        @SuppressWarnings("unchecked")
        public E next() {//获取 list 下一个元素
            checkForComodification();//检查是否有并发的线程对list进行修改
            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];
        }

        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();
            }
        }

        @Override
        @SuppressWarnings("unchecked")
        public void forEachRemaining(Consumer<? super E> consumer) {
            Objects.requireNonNull(consumer);
            final int size = ArrayList.this.size;
            int i = cursor;
            if (i >= size) {
                return;
            }
            final Object[] elementData = ArrayList.this.elementData;
            if (i >= elementData.length) {//检查到并发线程的修改
                throw new ConcurrentModificationException();
            }
            while (i != size && modCount == expectedModCount) {
                consumer.accept((E) elementData[i++]);//遍历线性表
            }//在迭代的末尾更新一次,减少堆内存的写入压力
            cursor = i;
            lastRet = i - 1;
            checkForComodification();
        }

        final void checkForComodification() {//检查是否有并发线程的修改,如果有就抛出异常
            if (modCount != expectedModCount)
                throw new ConcurrentModificationException();
        }
    }
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 本文首发于个人博客:Lam's Blog - 谈谈23种设计模式在Android源码及项目中的应用,文章由Mark...
    格子林ll阅读 10,122评论 1 105
  • 一.线性表 定义:零个或者多个元素的有限序列。也就是说它得满足以下几个条件:  ①该序列的数据元素是有限的。  ②...
    Geeks_Liu阅读 7,568评论 1 12
  • 昨天也就是周日,我内心忽然萌生了一种想法,就是尝试去公园做瑜伽。因为上周末去公园散步的时候,觉得公园是一个非常开乐...
    西西小时光阅读 3,593评论 1 2
  • 每次放假回家都会在吃晚饭的时候,跟爸爸妈妈一起看中央电视台,看新闻联播。从大年三十一直到初五,基本上...
    无右阅读 1,378评论 0 0
  • 一七令 .荷 荷, 倚碧,凌波。 羞杨柳,胜娇娥。 邀蝶飞舞,引蜂唱歌。 出污泥直正,摇绿水婆娑。 粉蕊栉风缱绻,...
    不语不问阅读 3,237评论 5 11

友情链接更多精彩内容