JAVA - HashMap,TreeMap迭代
1.使用for_each循环迭代
public class TestUnit { public static void main(String[] args) { HashMap hashMap=new HashMap<Integer,String>(); hashMap.put(1,"aaa"); hashMap.put(2,"bbb"); hashMap.put(3,"ccc"); for(Object m:hashMap.entrySet()) { Map.Entry mapEntry=(Map.Entry)m; Object key=mapEntry.getKey(); Object value=mapEntry.getValue(); System.out.println("key="+key+",value="+value); } } }
2.通过构造HashMap的entrySet来迭代
Iterator iter=hashMap.entrySet().iterator(); while(iter.hasNext()){ Map.Entry mapEntry=(Map.Entry) iter.next(); Object key=mapEntry.getKey(); Object value=mapEntry.getValue(); System.out.println("key="+key+",value="+value); }
3.先取得HashMap的keySet,再用get(key)访问
Set set=hashMap.keySet(); Iterator iter=set.iterator(); while(iter.hasNext()){ Object key=iter.next(); Object value=hashMap.get(key); System.out.println("key="+key+",value="+value); }
Test
据说是用entrySet更快一点,写段代码测试了一下,确实如此。(纠正:后来发现测试存在问题,谁先执行谁的耗时要多一点,估计是和第一个需要开辟输出缓冲区有关)

import java.util.HashMap; import java.util.Iterator; import java.util.Map; public class TestUnit { public static void main(String[] args) { HashMap<Integer, String> hashMap = new HashMap(); for (int i = 0; i < 10000; i++) { hashMap.put(i, "Hello World!"); } forEachTest(hashMap); entrySetTest(hashMap); keySetTest(hashMap); } static long forEachTest(Map map){ long startTime = System.currentTimeMillis(); for(Object m:map.entrySet()) { Map.Entry mapEntry=(Map.Entry)m; System.out.print(mapEntry.getValue()); } long endTime = System.currentTimeMillis(); System.out.println("\nforEachTest : " + (endTime - startTime)); return endTime - startTime; } static long keySetTest(Map map) { long startTime = System.currentTimeMillis(); Iterator iter = map.keySet().iterator(); while (iter.hasNext()) { System.out.print(map.get(iter.next())); } long endTime = System.currentTimeMillis(); System.out.println("\nkeySetTest : " + (endTime - startTime)); return endTime - startTime; } static long entrySetTest(Map map) { long startTime = System.currentTimeMillis(); Iterator iter = map.entrySet().iterator(); Map.Entry mapEntry; while (iter.hasNext()) { mapEntry = (Map.Entry) iter.next(); System.out.print(mapEntry.getValue()); } long endTime = System.currentTimeMillis(); System.out.println("\nentrySetTest : " + (endTime - startTime)); return endTime - startTime; } }
原因分析:
- 使用keySet方法访问时,构建的Set只由key组成,访问每一个value时要重新计算Hash值然后根据Hash值到Map中查找value;
- 使用entrySet方法访问时,构建的Set直接由<key,value>组成,访问每一个value时直接取就行,无需计算Hash值。
作者:北岛知寒
出处:https://www.cnblogs.com/crazyacking/p/5573528.html
版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?