网站首页 > 教程文章 正文
发现很多讲entrySet原理的文章都讲到entrySet方法返回map包含的映射集合视图就没了,并没有讲到为什么entrySet没有赋值却可以取到数据,这里简单梳理下。
public static void main(String[] args) {
Map<String, String> map = new HashMap<>();
map.put("1", "a");
for (Map.Entry<String, String> entry : map.entrySet()) {
System.out.println("k:" + entry.getKey() + "\tv:" + entry.getValue());
}
}
这是遍历hashMap常用的方式,可以看到for循环的是entrySet,但是看entrySet()方法中直接返回了一个entrySet,entrySet并没有存入数据过,那上面的遍历是怎么取到数据的?
答案就是编译器做了优化,会通过Iterator模式迭代遍历,最终操作的其实是hashmap底层结构中的table数组,并没有开辟新的空间。下面看下具体过程
1.看下上边代码对应的字节码指令(javap -verbose xx.class)。可以看到编译器优化之后最终通过Iterator遍历了,调用了hasNext和next方法。
2.entrySet方法返回的Set是EntrySet。EntrySet继承了AbstractSet,重写了iterator方法,最终使用的是EntryIterator迭代器,EntryIterator又继承了HashIterator,重新来next方法。在next方法中,调用了nextNode方法,nextNode中才是具体访问hashmap的table数组,获取元素。
3.debug验证下
猜你喜欢
- 2025-04-27 Java程序员,一周Python入门:数组,元组,集合,集合,字典
- 2025-04-27 redis Scan 踩坑记 key的模糊匹配
- 2025-04-27 Java开发面试官终结者!HashMap高频面试题总结,务必拿下
- 2025-04-27 内存溢出OutOfMemoryError科普系列一
- 2025-04-27 关于API接口的签名和权鉴,你知道多少?
- 2025-04-27 Java学习总结 2020/4/8
- 2025-04-27 LinkedHashMap源码分析及LRU实现原理
- 2025-04-27 揭秘HashMap扩容机制:为何应用变慢,如何彻底解决问题?
- 2025-04-27 Java 面试笔记之 HashMap 和 ConcurrentHashMap
- 2025-04-27 架构篇-一分钟掌握可扩展架构
- 最近发表
- 标签列表
-
- location.href (44)
- document.ready (36)
- git checkout -b (34)
- 跃点数 (35)
- 阿里云镜像地址 (33)
- qt qmessagebox (36)
- md5 sha1 (32)
- mybatis plus page (35)
- semaphore 使用详解 (32)
- update from 语句 (32)
- vue @scroll (38)
- 堆栈区别 (33)
- 在线子域名爆破 (32)
- 什么是容器 (33)
- sha1 md5 (33)
- navicat导出数据 (34)
- 阿里云acp考试 (33)
- 阿里云 nacos (34)
- redhat官网下载镜像 (36)
- srs服务器 (33)
- pico开发者 (33)
- https的端口号 (34)
- vscode更改主题 (35)
- 阿里云资源池 (34)
- os.path.join (33)