Java Map遍历方法(Map的Iterator原理)

        Map中存放数据的Key-Value实质上就是Node节点,而 底层是hash数组和链表(或树),不容易遍历。

一、containsKey() 和 get()查找元素

   这两个方法可以获得信息,但是依旧不能轻松遍历。
containsKey()方法判断对应的key是否存在;
get()方法得到对应key的键值对,依旧不是遍历。
1、containsKey() 和 get() 源码:
可见二者 都是通过getNode()方法获取对应的结果。
2、getNode()方法:
tab 是 table(哈希表)    first 哈希表找的链表或红黑树对应的头结点    e 代表当前节点    k 代表当前的 key
第一个if,将哈希表空的、长度不够的、对应位置没存数据的 都过滤掉;
第二个if,头结点就找到了 hash相等值相等 且 不空的 key或和当前节点 equals相等的节点,直接返回
第三个if,上一个if头结点不匹配,没找到,就用 next 找
第四个if,是红黑树就用红黑树的方法找
第五个if,不是红黑树,就是链表,则找next即可。

二、keySet()、values()、entrySet()遍历

        上述 containsKey() 和 get()方法虽然获得了部分信息,但不容易遍历。
为了方便遍历,提供了以下几个方法:
keySet()、values()、entrySet()用来方便遍历:
可见三个方法都是新建一个对应的类的对象,然后返回该对象。这三个类都是HashMap的内部类。
①接下来介绍这三个类(KetSet、Values、EntrySet):
    由下面源码可知,这三个类中
        KeySet和EntrySet继承了AbstractSet类
Values继承了AbstractCollection类
而类AbstractSet继承了AbstractCollection类,AbstractCollection类又实现了Collection接口。
KeySet类:
Values类:
EntrySet类:
②介绍这三个类的父类:AbstractSet类和 AbstractCollection类(同时解释如何遍历):
可见, AbstractSet类没有构造方法,而其父类AbstractCollection类构造方法如下,是一个空构造方法。
因此,下面三个类的父类都没有属性和构造函数,其本类也没有属性和构造函数,所以这些类都没有属性,都是 没有内容的"空对象"
那为什么输出三个类都可以 sout输出 以及为什么可以通过下面三个类的对象 进行遍历 呢?
a.可以输出:
相当于三个类都继承了AbstractCollection类,有两个是隔代继承,而 AbstractCollection类重写了toString()方法。
    toString()方法都是调用Iterator()方法,然后进行遍历。
    可是这是map,不是数组,理应没有 Iterator,因此肯定重写了:
        而在AbstractCollection类,该方法为空:
意味着子类重写了该方法( Iterator()方法 )
以子类HashMap为例:
由上面可知,HashMap的内部类KetSet、Values、EntrySet三者,都继承了AbstractCollection类,因此子类中必定重写了该方法:
三个类的源码在上面,在此处截取片段:
可见三个方法都实现了Iterator()的重写,
都是new一个对应的类,且对应的类都是HashMap的内部类:
KeySet -> KeyIterator
Values -> ValueIterator
EntrySet -> EntryIterator
由下图可知,三个类都继承了HashIterator类:
且其next()方法最后都是返回nextNode()的值
HashIterator类:
由下面源码可知,该类主要有两个方法,nextNode()和remove()方法
nextNode()使得其正确指向下一个节点。
nextNode():
可见,由于加进来的顺序是通过hash进行确定的,而遍历却是依次遍历table的每一个链表(树),
所以取出来的顺序和加入的顺序大概率不相同。
加入顺序:
map中table:
set中顺序(即去除==取出顺序):
因为其是按顺序依次遍历table的每一个链表(树),所以其取出顺序应与table表中顺序一致
由此解决了  KeySet、EntrySet和 Values三个类为何能正常输出:
首先, KeySet、EntrySet和Values间接或直接 继承了AbstractCollection类
-> AbstractCollection类重写了toString()方法
-> toString()方法调用Iterator()
->动态绑定到具体实现类,即HashMap的内部类:KeySet、Values、EntrySet
->三个类的Iterator()方法返回对应的三个类的对象:KeyIterator、ValueIterator、EntryIterator
->调用三个类的next()方法,其实是调用父类的nextNode()方法
->这三个类都继承自同一个类:HashIterator类
->该类主要有两个方法,nextNode()和remove()方法
b.可以遍历:
可以遍历原因跟上面一样。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/846524.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

浔川python社获得全网博主原力月度排名泸州地区第二名!

今日,浔川python社在查看全网博主原力月度排名泸州地区时,一看就震惊啦! 全网博主原力月度排名泸州地区排名榜单 全网博主原力月度排名泸州地区第二名为:浔川python社。 感谢粉丝们的支持!浔川python社还会继续努力&a…

【文献阅读】汽车上的信息安全工程

文章目录 前言 基本概念 信息安全评估 信息安全措施 测试验证 参考文献 前言 见《汽车电子——产品标准规范汇总和梳理(信息安全)》 基本概念 道路车辆信息安全 cybersecurity 使资产受到充分保护,免受道路车辆相关项、其功能及其电气或…

vue3-调用API实操-调用开源头像接口

文档部分 这边使用是开源的API 请求地址: :https://api.uomg.com/api/rand.avatar 返回格式 : json/images 请求方式: get/post 请求实例: https://api.uomg.com/api/rand.avatar?sort男&formatjson 请求参数 请求参数说明 名称必填类型说明sort否strin…

3DMAX建筑生长动画插件PolyFX安装使用方法

3DMAX建筑生长动画插件PolyFX安装使用教程 PolyFX插件是一个功能强大的工具,它可以将对象分解为片段并根据需要设置动画。它有许多用于微调动画的选项和一些附加工具。这是制作宣传视频、游戏开发等的绝佳解决方案。 【版本要求】 3ds max 2010-2025(不…

西门子电梯控制保姆级教程

一、电梯运行控制 1.电梯控制系统结构 可以理解是通过ip进行访问的 2.基于PLCSIM Adv与电梯仿真软件的控制环境搭建 虽然都是用一台电脑来控制,但是还是用以太网来连接 在FC块里面也要用两个DB块来放输入和输出 二、电梯对象的分析 在eet里面,用手动控制…

探讨大米自动化生产线包装设备的智能化发展趋势

随着科技的飞速发展,智能化已经成为各行各业转型升级的重要方向。在大米生产领域,自动化生产线包装设备的智能化发展更是引领着粮食产业的未来潮流。星派将从智能化技术、市场需求、发展趋势等方面,探讨大米自动化生产线包装设备的智能化发展…

LeetCode 算法:找到字符串中所有字母异位词c++

原题链接🔗:找到字符串中所有字母异位词 难度:中等⭐️⭐️ 题目 给定两个字符串 s 和 p,找到 s 中所有 p 的 异位词 的子串,返回这些子串的起始索引。不考虑答案输出的顺序。 异位词 指由相同字母重排列形成的字符…

Python高阶学习记录

文章导读 阅读本文需要一定的python基础,部分知识点是对python入门篇学习记录和python并发编程学习记录的深入探究,本文记录的Python知识点包括函数式编程,装饰器,生成器,迭代器,正则表达式,内存…

eNSP——两台电脑通过一根网线直连通信

一、拓扑结构 二、电脑配置 ip和子网掩码,配置两台电脑处于同一网段 三、测试 四、应用 传文件等操作,可以在一台电脑上配置FTP服务器

Java零基础-顺序结构

哈喽,各位小伙伴们,你们好呀,我是喵手。运营社区:C站/掘金/腾讯云;欢迎大家常来逛逛 今天我要给大家分享一些自己日常学习到的一些知识点,并以文字的形式跟大家一起交流,互相学习,一…

高清矩阵是什么?

在数学中,矩阵是一个按照长方阵列排列的复数或实数集合,最早来自于方程组的系数及常数所构成的方阵。如图为m行n列的矩阵: 由此延伸可以想到矩阵图片是把一个三维空间分切成多个行和列的区域进行图像捕获,将捕获图像再进行拼合成为…

关于苹果发布IOS18系统,以及Siri升级贾维斯

随着科技的不断进步,手机操作系统也在持续升级,为用户提供更加智能化、便捷化的体验。近期,苹果公司即将推出的iOS 18系统引起了广泛关注。作为iPhone历史上的重大更新,iOS 18系统带来了众多新功能,将进一步提升iPhone…

2024-6-2 石群电路-21

2024-6-2,星期日,天气:阴,心情:晴。今天没什么特别的事情发生,心情还是一如既往的好,明天就周一啦,虽然我暂时不用上班,但是希望大家新的一周元气满满~ 今日观看了石群老…

STL中vector动态二维数组理解(杨辉三角)

题目链接&#xff1a;118.杨辉三角 题目描述&#xff1a; 给定一个非负整数 numRows&#xff0c;生成「杨辉三角」的前 numRows 行。 在「杨辉三角」中&#xff0c;每个数是它左上方和右上方的数的和。 题目指要&#xff1a; 本题的主要目的是理解vector<vector<int&…

18 跨团队 没有汇报线的人和事就是推不动?

在“05 | 大项目&#xff1a;把握关键点&#xff0c;谋定而后动”和“11 | 勤沟通&#xff1a;在信任的基础上&#xff0c;让沟通简单”两讲中&#xff0c;我提过“跨团队”这件事&#xff0c;很多同学带团队之后&#xff0c;无法回避的一个问题就是“跨团队协作”&#xff0c;…

2024/6/2 英语每日一段

However, they denied Hirst had been deliberately misleading, arguing that it was his “usual practice” to date physical works in a conceptual art project with the date of the project’s conception, which in the case of The Currency was 2016. Hirst and Sci…

Python | 自动探索性数据分析(EDA)库SweetViz

SweetViz是一个开放源代码Python库&#xff0c;主要用于生成精美的高密度可视化文件&#xff0c;启动探索性数据分析&#xff08;EDA&#xff09;&#xff0c;输出为完全独立的HTML应用程序。 探索性数据分析&#xff08;EDA&#xff09;是分析和总结数据集主要特征的过程&…

AOP案例

黑马程序员JavaWeb开发教程 文章目录 一、案例1.1 案例1.2 步骤1.2.1 准备1.2.2 编码 一、案例 1.1 案例 将之前案例中增、删、改相关节后的操作日志记录到数据库表中。 操作日志&#xff1a;日志信息包含&#xff1a;操作人、操作时间、执行方法的全类名、执行方法名、方法…

52.WEB渗透测试-信息收集-CDN识别绕过(5)

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 内容参考于&#xff1a; 易锦网校会员专享课 上一个内容&#xff1a;51.WEB渗透测试-信息收集-CDN识别绕过&#xff08;4&#xff09; 端口扫描其他内容参考&…

几何裁剪技术在AI去衣应用中的革新作用

引言&#xff1a; 随着人工智能技术的飞速发展&#xff0c;其在图像处理领域的应用也日益广泛。特别是在AI去衣技术中&#xff0c;几何裁剪技术扮演着至关重要的角色。本文将深入探讨几何裁剪技术在AI去衣中的应用及其带来的影响。 一、几何裁剪技术概述 几何裁剪技术是一种基…