遍历map的四种方法及性能比较

遍历map的四种方法及性能比较

“写代码时,每次都要告诉自己:最后负责维护代码的,会是一个知道你住在哪的变态暴力狂。"——约翰·伍德(John Woods)

传送门

· 遍历map的四种方式方式一:通过遍历map的keyset方式二:使用map的entrySet方式三:使用迭代器iterator方式四:使用map的values方法

· 耗时比较· 总结· 小彩蛋

昨天在公司用FindBugs插件扫了下组里的代码,发现很多map遍历的性能问题,在这里做个总结和分享,大家有什么不同意见可以随时提。(以下基于HashMap测试,文末还有彩蛋)

· 遍历map的四种方式

方式一:通过遍历map的keyset

// 方法一:遍历keySet

clock.start("遍历keySet");

Set keySet = map.keySet();

for (String key : keySet) {

String value = map.get(key);

}

clock.stop();

方式二:使用map的entrySet

// 方法二:使用entrySet

clock.start("使用entrySet");

Set> entries = map.entrySet();

for (Map.Entry entry : entries) {

String value = entry.getValue();

}

clock.stop();

方式三:使用迭代器iterator

// 方式三:使用iterator

clock.start("使用iterator");

Iterator> iterator = map.entrySet().iterator();

while (iterator.hasNext()) {

Map.Entry next = iterator.next();

String value = next.getValue();

}

clock.stop();

方式四:使用map的values方法

// 方式四:使用values

clock.start("使用values");

for (String v : map.values()) {

String value = v;

}

clock.stop();

· 耗时比较

Map map = new HashMap<>();

for (int i = 0; i < 1000000; i ++) {

map.put(String.valueOf(i), "value:" + i);

}

构造了一个简单的HashMap,使用四种方法循环跑了5次,结果如下: 第一次:

ms%name00087036%遍历keySet00060025%使用entrySet00048020%使用iterator00045019%使用values

第二次:

ms%name00170043%遍历keySet00085022%使用entrySet00071018%使用iterator00067017%使用values

第三次:

ms%name00098037%遍历keySet00062023%使用entrySet00052019%使用iterator00056021%使用values

第四次:

ms%name00089034%遍历keySet00065025%使用entrySet00046018%使用iterator00060023%使用values

第五次:

ms%name00098036%遍历keySet00065024%使用entrySet00054020%使用iterator00056021%使用values

· 总结

1、总的来开,使用iterator迭代器的效率通常是最好的;使用map的keySet遍历value性能最差。 2、结合具体情况:如果只需要遍历出map的所有key,那么keySet无疑是最合适的,因为没有取出value,节省了不必要的空间浪费。

· 小彩蛋

我们都知道,Java标准类库包含了多种Map的基本实现,包括:HashMap、TreeMap、LinkedHashMap、WeakHashMap、ConcurrentHashMap、IdentityHashMap。

由于他们的数据结构不同,行为特征也各不相同,具体表现在效率、键值对保存、呈现次序等多个方面。

就本文的主题来说,TreeMap的结论会更加突出,而WeakHashMap、IdentityHashMap的结论则会有很大不同,感兴趣的话大家可以自己去试试,顺便看一下各种map的实现及源码,会让你对本文结论有更深入的理解。😐

猜你喜欢

触漫怎么制作封面?触漫制作封面教程
365be是啥

触漫怎么制作封面?触漫制作封面教程

📅 07-19 ❤️ 92
nba常规赛有多少场球队,nba常规赛有多少场?
365bet网上平台

nba常规赛有多少场球队,nba常规赛有多少场?

📅 07-10 ❤️ 851
手机上如何修改pdf文件,具体操作方法是什么
365bet网上平台

手机上如何修改pdf文件,具体操作方法是什么

📅 07-14 ❤️ 924
多账号资源全局可见及搜索
365be是啥

多账号资源全局可见及搜索

📅 08-02 ❤️ 430
华硕BIOS怎么进入PE?华硕主板进入U盘启动PE系统教程
365体育竞彩足球

华硕BIOS怎么进入PE?华硕主板进入U盘启动PE系统教程

📅 06-30 ❤️ 389
Win8更改账户方法指南:轻松实现账户权限调整
365bet网上平台

Win8更改账户方法指南:轻松实现账户权限调整

📅 08-04 ❤️ 449
苹果7的nfc在哪里设置
365bet网上平台

苹果7的nfc在哪里设置

📅 08-09 ❤️ 862
主机无法连接到显示器和键盘的解决方法
365be是啥

主机无法连接到显示器和键盘的解决方法

📅 07-16 ❤️ 884
小白必看!新能源汽车充电保姆级攻略来啦
365bet网上平台

小白必看!新能源汽车充电保姆级攻略来啦

📅 08-05 ❤️ 660