关于HashMap的实现这里就不展开了,具体可以参考JDK7与JDK8中HashMap的实现。
https://my.oschina.net/hosee/blog/618953
JDK8之前,可以使用keySet或者entrySet来遍历HashMap,JDK8中引入了map.foreach来进行遍历。
原因:
keySet其实是遍历了2次,一次是转为Iterator对象,另一次是从hashMap中取出key所对应的value。而entrySet只是遍历了一次就把key和value都放到了entry中,效率更高。如果是JDK8,使用Map.foreach方法。
1. keySet和entrySet
1.1 基本用法
keySet:
![6607825d81b5381d1ce996f02fd07687.png](https://i-blog.csdnimg.cn/blog_migrate/625ce7cb79c705c667debe9b27e1a9cd.jpeg)
entrySet:
![8ee5cfe6fb1f009a02bc936e3d15ee9c.png](https://i-blog.csdnimg.cn/blog_migrate/2f78a4b5e15a4bd809c7919abbe4d7f0.jpeg)
![0cb4b742b6d72887675a79846a0441cb.png](https://i-blog.csdnimg.cn/blog_migrate/1bf3395c2e924554a283e0a1fe682411.jpeg)
其实这里已经很明显了,当要得到某个value时,keySet还需要从HashMap中get,entrySet相比keySet少了遍历table的过程,这也是两者性能上的主要差别。
2. Map.foreach
在JDK8以后,引入了Map.foreach。
Map.foreach本质仍然是entrySet
![c1d9d04f9e9d39c6daf8a32b102801d7.png](https://i-blog.csdnimg.cn/blog_migrate/b8f08b526960861dd53aeff51ebffe0c.jpeg)
配合lambda表达式一起使用,操作起来更加方便。
2.1 使用Java8的foreach+lambda表达式遍历Map
![f66baa7a80120ba41f03d2114e638890.png](https://i-blog.csdnimg.cn/blog_migrate/d8d46e0c2313ca4a109c3784d1360e7d.jpeg)
写在最后:小编为大家准备了一些适合于1-5年以上开发经验的java程序员面试涉及到的绝大部分面试题及答案做成了文档和学习笔记文件以及架构视频资料免费分享给大家(包括Dubbo、Redis、Netty、zookeeper、Spring cloud、分布式、高并发等架构技术资料),希望可以帮助到大家。
![ecd3f109d8bb5497afb0a889b64b600b.png](https://i-blog.csdnimg.cn/blog_migrate/8d235144d9e61b6778ed099c4d8a5549.jpeg)
![3ee19b05ec907be41b1e1f65db8fc975.png](https://i-blog.csdnimg.cn/blog_migrate/47e18c1348897a08d84f73ab196eb8b4.jpeg)