当前位置: 首页 > news >正文

HashMap中的迭代器

abstract class HashIterator {
        Node<K,V> next;        // next entry to return
        Node<K,V> current;     // current entry
        int expectedModCount;  // for fast-fail	记录修改次数,多线程引起两次修改次数不同将抛出异常
        int index;             // current slot

        HashIterator() {
            expectedModCount = modCount;
            Node<K,V>[] t = table;
            current = next = null;
            index = 0;
            if (t != null && size > 0) { // advance to first entry
                do {} while (index < t.length && (next = t[index++]) == null);//遍历数组,直到找到一个不为空的值
            }
        }

        public final boolean hasNext() {
            return next != null;
        }

        final Node<K,V> nextNode() {
            Node<K,V>[] t;
            Node<K,V> e = next;
            if (modCount != expectedModCount)
                throw new ConcurrentModificationException();
            if (e == null)
                throw new NoSuchElementException();
            if ((next = (current = e).next) == null && (t = table) != null) {//判断当前节点next下不是否挂有节点
                do {} while (index < t.length && (next = t[index++]) == null);//否则遍历数组
            }
            return e;
        }

        public final void remove() {
            Node<K,V> p = current;
            if (p == null)
                throw new IllegalStateException();
            if (modCount != expectedModCount)
                throw new ConcurrentModificationException();
            current = null;
            K key = p.key;
            removeNode(hash(key), key, null, false, false);
            expectedModCount = modCount;
        }
    }

    final class KeyIterator extends HashIterator
        implements Iterator<K> {
        public final K next() { return nextNode().key; }
    }

    final class ValueIterator extends HashIterator
        implements Iterator<V> {
        public final V next() { return nextNode().value; }
    }

    final class EntryIterator extends HashIterator
        implements Iterator<Map.Entry<K,V>> {
        public final Map.Entry<K,V> next() { return nextNode(); }
    }

真正存储节点的只有table数组,迭代器只是在初始化指向table数组的第一个不为null的节点

相关文章:

  • Hashtable中的get(key)方法,为什么进行hash 0x7FFFFFFF
  • Hashtable中的rehash()方法
  • mysql查询一个时间段的数据
  • Linux中的shell是什么
  • JUC笔记
  • 共享模型之管程
  • 共享模型之内存
  • 共享模型之无锁
  • 全面解析ThreadLocal
  • BIO-NIO-AIO笔记
  • docker 运行出错 Error response from daemon: error creating overlay mount to /var/lib/docker/overlay2/007
  • JAVA多态
  • 状态压缩DP--------蒙德里安的梦想
  • 区间DP————石子合并
  • C/C++无穷大的表示 0x7fffffff + 0x7fffffff= 负数
  • SegmentFault for Android 3.0 发布
  • #Java异常处理
  • android高仿小视频、应用锁、3种存储库、QQ小红点动画、仿支付宝图表等源码...
  • Angular数据绑定机制
  • E-HPC支持多队列管理和自动伸缩
  • Go 语言编译器的 //go: 详解
  • HTTP那些事
  • js ES6 求数组的交集,并集,还有差集
  • Js基础知识(四) - js运行原理与机制
  • Laravel 实践之路: 数据库迁移与数据填充
  • Markdown 语法简单说明
  • mysql中InnoDB引擎中页的概念
  • Node.js 新计划:使用 V8 snapshot 将启动速度提升 8 倍
  • Redis学习笔记 - pipline(流水线、管道)
  • Sass Day-01
  • Spark VS Hadoop:两大大数据分析系统深度解读
  • Spring思维导图,让Spring不再难懂(mvc篇)
  • Webpack入门之遇到的那些坑,系列示例Demo
  • 多线程 start 和 run 方法到底有什么区别?
  • 更好理解的面向对象的Javascript 1 —— 动态类型和多态
  • 后端_MYSQL
  • 简析gRPC client 连接管理
  • 思考 CSS 架构
  • 小程序滚动组件,左边导航栏与右边内容联动效果实现
  • 一些css基础学习笔记
  • 阿里云服务器购买完整流程
  • 容器镜像
  • 曜石科技宣布获得千万级天使轮投资,全方面布局电竞产业链 ...
  • ​TypeScript都不会用,也敢说会前端?
  • #define与typedef区别
  • (003)SlickEdit Unity的补全
  • (20050108)又读《平凡的世界》
  • (Note)C++中的继承方式
  • (编译到47%失败)to be deleted
  • (第二周)效能测试
  • (二)hibernate配置管理
  • (分布式缓存)Redis持久化
  • (附源码)springboot学生选课系统 毕业设计 612555
  • (六)vue-router+UI组件库
  • (三) prometheus + grafana + alertmanager 配置Redis监控