Map作为Java中的一种集合,以键值对的形式存放一批数据,经常会被我们应用在项目中。
既然是一种集合,自然就有需要遍历的场景。今天就来说5种遍历Map的方法。
01通过map对象的entrySet遍历Map
通过map.entrySet()方法,可以获取到一个set集合,而这个集合的每一个元素就是一个键值对。
如此就可以通过遍历通过map.entrySet()获取到的set集合来达到遍历Map的目的了。
示例代码展示一下。
通过这种方式,可以同时遍历到Map的key和value。
02通过迭代器(Iterator)的方式遍历Map
遍历集合的地方就少不了会出现迭代器(Iterator)的身影。
下面来一段示例,看看怎么通过迭代器(Iterator)来遍历Map。
看过我之前写的《我们来看看Java的foreach的真面目吧》这篇文章的朋友,应该知道。第一种遍历方式其实是第二种遍历方式通过语法糖做的一种编码方式,也就是第一种遍历方式在编译后实际就是第二种遍历方式了。
03通过map对象的keySet()遍历Map
通过map.keySet()方法可以获取到存放了Map的所有key的一个Set。然后通过遍历这个Set就可以做到遍历Map的效果了。
具体看下面的示例代码。
通过这种方式,可以遍历到Map的key,如果想要同时遍历到Map的value,就需要通过key来从Map这个集合中获取对应的value了。
04通过map对象的values()遍历Map
上面是通过遍历key来实现遍历Map的效果。那是不是也能遍历value来达到遍历Map的效果呢。
答案是有的,通过map.values()就可以获取到存放了Map中所有value的一个集合了。
然后就可以通过遍历这个value的集合来达到遍历Map的目的了。
具体怎么实现看下面的示例代码。
通过这种方式遍历Map的话,只能遍历到Map的所有value,但是无法获取Map的key。所以如果遍历时还需要获取key的话,就不适合使用这种遍历Map的方法了。
05通过Lambda表达式的方式遍历Map
从Java8开始,Java提供了对Lambda表达式的支持。通过Lambda表达式可以使代码更简洁明了(当然如果太长就另当别论了)。
其中就有可以遍历Map的方式。
那具体怎么通过Lambda表达式来遍历Map呢,请接着往下看下面的示例代码吧。
其实和第一种通过foreach的形式遍历map对象的entrySet方法获取到的set,很是相似。
大家有没有发现上面这段示例代码中,map.forEach这个语句idea给出了一个提示,那是因为这个Lambda还可以再精简。变成下面这样。
可能刚接触Lambda表达式的时候,会觉得很多地方挺别扭。其实慢慢的你会发现Java8开始通过Lambda表达式来编码还是挺有意思的。
(画外音:Lambda表达式可以以后单独写写)
今天Java遍历Map的5种方法就说完了。有意见建议的朋友可以在评论区留言告诉我。
相关资源:Java遍历Map键、值和获取Map大小的方法示例_获取map的长度,java…
代码如下
import org.junit.Test;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
public class TestHasMap {
@Test
public void testMapsArray(){
HashMap<Integer, String> map = new HashMap<>();
for (int i = 0; i < 40000; i++) {
map.put(i, "第" + i + "个");
}
//循环第一种
long t1 = System.nanoTime();
Object key[] = map.keySet().toArray();
for (int i = 0; i < map.size(); i++) {
map.get(key[i]);
}
long t2 = System.nanoTime();
//循环第二种
for (Map.Entry<Integer, String> entry : map.entrySet()) {
entry.getValue();
}
long t3 = System.nanoTime();
//循环第三种
Iterator<Integer> it = map.keySet().iterator();
while (it.hasNext()) {
Integer ii = (Integer) it.next();
map.get(ii);
}
long t4 = System.nanoTime();
// 循环第四种
for (Integer kk : map.keySet()) {
map.get(kk);
}
long t5 = System.nanoTime();
// 循环第五种
map.forEach((Key,value) -> {
map.get(Key);
});
long t6 = System.nanoTime();
System.out.println("第一种方法耗时:" + (t2 - t1) / 1000 + "微秒");
System.out.println("第二种方法耗时:" + (t3 - t2) / 1000 + "微秒");
System.out.println("第三种方法耗时:" + (t4 - t3) / 1000 + "微秒");
System.out.println("第四种方法耗时:" + (t5 - t4) / 1000 + "微秒");
System.out.println("第五种方法耗时:" + (t6 - t5) / 1000 + "微秒");
}
}
运行结果如下
第一种方法耗时:22908微秒
第二种方法耗时:8903微秒
第三种方法耗时:3745微秒
第四种方法耗时:3441微秒
第五种方法耗时:89185微秒
总结
当我们使用的时候,尽量使用第四种写法,较为稳定,Map.forEach()的写法更偏向于js 的写法,然这种写法不太稳定