HashMap 详解七
使用 Iterator 遍历
通过 HashMap.entrySet().iterator() 方法获取迭代器, 使用 next 方法对 HashMap 进行遍历.
HashMap<String, String> map = new HashMap<>(); Iterator it = map.entrySet().iterator(); while(it.hasNext()) { Map.Entry<String, String> entry = it.next(); }
下面详细讲解各个方法的作用, 其实迭代器之所以能遍历元素节点, 主要是应用了内部类. 通过内部类可以访问外部类的变量和方法, 从而完成遍历节点.
entrySet()
/** * 直接返回 EntrySet 的实例 * 注意这里 entrySet 不是静态方法, 而 EntrySet 是非静态的内部类, 所以可以直接 new 实例 */ public Set<Map.Entry<K,V>> entrySet() { Set<Map.Entry<K,V>> es; return (es = entrySet) == null ? (entrySet = new EntrySet()) : es; }
EntrySet
/** * EntrySet 继承于 AbstractSet */ final class EntrySet extends AbstractSet<Map.Entry<K,V>> { ... /** * 返回 EntryIterator 实例, 这也是属于 HashMap 的非静态内部类 */ public final Iterator<Map.Entry<K,V>> iterator() { return new EntryIterator(); } ... }
EntryIterator
/** * HashMap 的非静态内部类 */ final class EntryIterator extends HashIterator implements Iterator<Map.Entry<K,V>> { /** * next 方法调用父类 HashIterator 的 nextNode 方法, 返回下一个元素 */ public final Map.Entry<K,V> next() { return nextNode(); } }
HashIterator
/** * 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 /** * 构造函数, 从 0 开始遍历 HashMap 的保存数组, 一直到非空元素 */ 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) { // 链表遍历完全后, 重新读取数组的下一个非空元素 do {} while (index < t.length && (next = t[index++]) == null); } return e; } }
以上就是 HashMap 的遍历方法, 它不是按照插入节点的先后顺序进行遍历, 而是按照数组结构来遍历.

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
深入理解Python字符串的用法
0. 拼接字符串 字符串的拼接操作最常用,我专门为这个话题写过一篇《Python拼接字符串的七种方式》,建议你回看。 在此,简单回顾一下:七种拼接方式从实现原理上划分为三类,即格式化类(%占位符、format()、template)、拼接类(+操作符、类元祖方式、join())与插值类(f-string),在使用上,我有如下建议—— 当要处理字符串列表等序列结构时,采用join()方式;拼接长度不超过20时,选用+号操作符方式;长度超过20的情况,高版本选用f-string,低版本时看情况使用format()或join()方式。 不敢说字符串就只有这七种拼接方式,但应该说它们是最常见的了。有小伙伴说,我写漏了一种,即字符串乘法,可以重复拼接自身。没错,从结果上看,这是第八种拼接方式,视为补充吧。 关于字符串拼接,还得补充一个建议,即在复杂场
- 下一篇
.NET Core实战项目之CMS 第二章 入门篇-快速入门ASP.NET Core看这篇就够了
作者:依乐祝原文链接:https://www.cnblogs.com/yilezhu/p/9985451.html本来这篇只是想简单介绍下ASP.NET Core MVC项目的(毕竟要照顾到很多新手朋友),但是转念一想不如来点猛的(考虑到急性子的朋友),让你通过本文的学习就能快速的入门ASP.NET Core。既然是快速入门所以过多过深的内容我这里就一笔带过了!然后在后面的一些列文章中再慢慢的对其中的概念进行阐述。本文已收录至.NET Core实战项目之CMS 第一章 入门篇-开篇及总体规划 点击可以查看更多教程。 .NET Core是什么 很多朋友看到.NET Core就认为是ASP.NET Core,其实这是有误区的,因为.NET Core 是开放源代码的通用开发平台 (是一个“平台”),基于这个开放平台我们可以开发像ASP.NET Core应用程序, Windows 10 通用 Windows 平台 (UWP),Tizen等等,而我们系列教程就是用.NET Core开发ASP.NET Core应用程序。而且由 Microsoft官方团队 和 .NET社区成员共同在 GitHub ...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- 设置Eclipse缩进为4个空格,增强代码规范
- CentOS关闭SELinux安全模块
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- Windows10,CentOS7,CentOS8安装Nodejs环境
- CentOS7设置SWAP分区,小内存服务器的救世主
- SpringBoot2整合Redis,开启缓存,提高访问速度
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- SpringBoot2全家桶,快速入门学习开发网站教程