java 中的 map 遍历有多种方法,从最早的 Iterator,到 java5 支持的 foreach, 再到 java8 Lambda,让我们一起来看下具体的用法以及各自的优缺点
先初始化一个 map
- public classTestMap {public staticMap map = newHashMap();
- }
如果只需要 map 的 key 或者 value,用 map 的 keySet 或 values 方法无疑是最方便的
- // 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);
- }
- }
如果需要同时获取 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));
- }
- }
通过对 map entrySet 的遍历,也可以同时拿到 key 和 value,一般情况下,性能上要优于上一种, 这一种也是最常用的遍历方法
- // entrySet 获取key and value
- public void testEntry() {for(Map.Entry entry : map.entrySet()) {
- System.out.println(entry.getKey() +":"+ entry.getValue());
- }
- }
对于上面的几种 foreach 都可以用 Iterator 代替,其实 foreach 在 java5 中才被支持,foreach 的写法看起来更简洁
但 Iterator 也有其优势:在用 foreach 遍历 map 时,如果改变其大小,会报错,但如果只是删除元素,可以使用 Iterator 的 remove 方法删除元素
- // Iterator entrySet 获取key and value
- public void testIterator() {
- IteratorEntry> it = map.entrySet().iterator();while(it.hasNext()) {
- Map.Entry entry = it.next();
- System.out.println(entry.getKey() +":"+ entry.getValue());// it.remove(); 删除元素}
- }
java8 提供了 Lambda 表达式支持,语法看起来更简洁,可以同时拿到 key 和 value,不过,经测试,性能低于 entrySet, 所以更推荐用 entrySet 的方式
- // Lambda 获取key and value
- public void testLambda() {
- map.forEach((key, value) -> {
- System.out.println(key +":"+ value);
- });
- }
用 10 万条数据,做了一个简单性能测试,数据类型为 Integer,map 实现选取 HashMap
- static{for(inti =0; i <100000; i++) {
- map.put(i,1);
- }
- }
测试结果如下:
- KeySet:392Values:320keySetget(key):552entrySet:465entrySet Iterator:508Lambda:536
需要说明的是,map 存储的数据类型,map 的大小,以及 map 的不同实现方式都会影响遍历的性能,所以该测试结果仅供参考
如果只是获取 key,或者 value,推荐使用 keySet 或者 values 方式
如果同时需要 key 和 value 推荐使用 entrySet
如果需要在遍历过程中删除元素推荐使用 Iterator
如果需要在遍历过程中增加元素,可以新建一个临时 map 存放新增的元素,等遍历完毕,再把临时 map 放到原来的 map 中
来源: http://www.cnblogs.com/zhaoguhong/p/7074597.html