
本文共 2522 字,大约阅读时间需要 8 分钟。
版权声明: 本文为转载文章, 转载时有适量修改. 再次转载时请附上原文出处链接和本声明.
作者:zhaoguhong(赵孤鸿)出处:
Java 中遍历 Map 有多种方法, 从最早的迭代器 Iterator, 到 JDK 5 开始支持的增强型 for 循环 —— 即 foreach, 再到 JDK 8 的 Lambda 表达式, 让我们一起来看下具体的用法及其优缺点.
1 通过 keySet() 或 values() 方法遍历
如果只需要获取 Map 的 key 或者 value, 通过 Map 的 keySet()
或 values()
方法无疑是最方便的:
public class TestMap { /** * Map 的扩容比较消耗性能, 因此若能确定存储数据的大小, * 在初始化时指定初始容量是一个不错的实践技巧 */ private static Mapmap = new HashMap<>(16); /** keySet 获取 key */ public void testKeySet() { for (Integer key : map.keySet()) { System.out.println(key); } } /** values 获取 value */ public void testValues() { for (Integer value : map.values()) { System.out.println(value); } }}
2 通过 keySet 的 get(key) 获取值
如果需要同时获取 key 和 value, 可以通过先获取 key, 然后再通过 Map 的 get(key)
获取对应的 value.
注意: 该方法不是最优选择, 一般不推荐使用.
/** keySet get(key) 获取key and value */ public void testKeySetAndGetKey() { for (Integer key : map.keySet()) { System.out.println(key + ":" + map.get(key)); } }
3 通过 entrySet 遍历
通过对 Map 的 entrySet 进行遍历, 也可以同时拿到 key 和 value.
该方法是最常用的遍历 Map 的方法, 大多情况下, 其性能要优于第2种.
/** * entrySet 获取 key 和 value, Entry 是 Map 内部存储数据的逻辑容器 */ public void testEntry() { for (Map.Entryentry : map.entrySet()) { System.out.println(entry.getKey() + ":" + entry.getValue()); } }
4 通过迭代器 Iterator 遍历
上面的几种遍历方法都用了增强型 for 循环 —— foreach, 这是 JDK 5 开始才有的特性.
foreach
的操作虽然看起来很简洁, 但有一个劣势: 遍历 Map 时, 如果改变其大小, 就会抛出并发修改异常. 但如果在遍历时只需要删除 Map 中的元素, 那就可以用 Iterator 的 remove()
方法删除元素:
/** Iterator 获取 key 和 value */ public void testIterator() { Iterator> it = map.entrySet().iterator(); while (it.hasNext()) { Map.Entry entry = it.next(); System.out.println(entry.getKey() + ":" + entry.getValue()); // 删除元素 // it.remove(); } }
5 通过 Lambda 表达式遍历
JDK 8 提供了 Lambda 表达式支持, 其语法看起来更简洁, 可以同时拿到 key 和 value.
不过, 经过简单的测试, Lambda 表达式遍历 Map 的速度要低于 entrySet 遍历的方式, 所以更推荐用 entrySet 去遍历 Map.
/** Lambda 获取key and value */ public void testLambda() { map.forEach((key, value) -> { System.out.println(key + ":" + value); }); }
6 总结 - 遍历 Map 的实践建议
(1) 如果只获取 key 或者 value, 推荐使用 keySet()
或 values()
方法;
版权声明
本文版权归原作者所有, 如有侵权, 请联系博主, 定当立即删除.
若要转载, 请在文章页面明显位置标明原始链接, 否则一切责任自负.
发表评论
最新留言
关于作者
