1. 前言
【推荐】使用entrySet遍历Map类集合KV,而不是keySet方式进行遍历。 说明:keySet其实是遍历了2次,一次是转为Iterator对象,另一次是从hashMap中取出key所对应的value。而entrySet只是遍历了一次就把key和value都放到了entry中,效率更高。
2.map集合遍历的几种方式
foreachKeyset 遍历
//根据 key 找 value
for (Integer key : map.keySet()) {
String value = map.get(key);
// System.out.println("foreachKeyset : key :" + key + "---> value :"+ value);
}
foreachEntry遍历
//根据 key--value 键值对 找键和值 ( foreach 遍历)
for (Entry<Integer, String> entry : map.entrySet()) {
// System.out.println("foreachEntry : key :" + entry.getKey() + "---> value :"+entry.getValue());
}
iteratorEntry遍历
//根据 key--value 键值对 找键和值 ( iterator 遍历)
Iterator<Entry<Integer, String>> iterator = map.entrySet().iterator();
while (iterator.hasNext()) {
Entry<Integer, String> entry = iterator.next();
//System.out.println("iteratorEntry : key :" + entry.getKey() + "---> value :"+entry.getValue());
}
lambadaEntry遍历
//基于JDK1.8版本以上 lambada函数
map.forEach((k, v) -> {
System.out.println("key:"+k+"values:"+v);
});
mapValues遍历
//只能取到values
for(Object m:map.values()){
System.out.println(m);
}
测试实例:
package com.xiaoxit.erp.core.controller.exe;
/**
* @version 1.0
* @ClassName s
* @Description
* @Author wuronghua
* @Date 2019/11/6 16:22
*/
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;
import org.junit.Test;
/**
* description: 遍历Map集合效率比较
*
* @author w
* @version v1.0
* @date 2018年10月23日上午11:20:08
*/
public class ForeachMap {
/**
* description: 初始化map集合中元素
*
* @param map
* @version v1.0
* @author w
* @date 2018年10月23日 下午2:45:35
*/
public void init(Map<Integer, String> map) {
// 初始化map集合中元素的个数
int count = 1000000;
for (int i = 1; i <= count; i++) {
map.put(i, i + " ---> map");
}
}
/**
* 在只需要values时,for (Object m : map.values()) 最快
* 同时需要key,values时,iterator 最快
*/
@Test
public void test() {
Map<Integer, String> map = new HashMap<>();
Map<Integer, String> map2 = new HashMap<>();
long start = System.currentTimeMillis();
init(map);
init(map2);
System.out.println("装载map耗时: " + (System.currentTimeMillis() - start) + " ms");
start = System.currentTimeMillis();
foreachKeyset(map);
System.out.println("foreachKeyset 遍历 map耗时: " + (System.currentTimeMillis() - start) + " ms");
start = System.currentTimeMillis();
foreachEntry(map2);
System.out.println("foreachEntry 遍历 map耗时: " + (System.currentTimeMillis() - start) + " ms");
start = System.currentTimeMillis();
iteratorEntry(map2);
System.out.println("iteratorEntry 遍历 map耗时: " + (System.currentTimeMillis() - start) + " ms");
start = System.currentTimeMillis();
lambadaEntry(map2);
System.out.println("lambadaEntry 遍历 map耗时: " + (System.currentTimeMillis() - start) + " ms");
start = System.currentTimeMillis();
mapValuesEntry(map2);
System.out.println("mapValuesEntry 遍历 map耗时: " + (System.currentTimeMillis() - start) + " ms");
System.out.println(map.size());
}
/**
* description: 根据 key 找 value
*
* @param map
* @version v1.0
* @author w
* @date 2018年10月23日 下午5:10:01
*/
private void foreachKeyset(Map<Integer, String> map) {
for (Integer key : map.keySet()) {
String value = map.get(key);
// System.out.println("foreachKeyset : key :" + key + "---> value :"+ value);
}
}
/**
* description: 根据 key--value 键值对 找键和值 ( foreach 遍历)
*
* @param map
* @version v1.0
* @author w
* @date 2018年10月23日 下午5:19:31
*/
private void foreachEntry(Map<Integer, String> map) {
for (Entry<Integer, String> entry : map.entrySet()) {
// System.out.println("foreachEntry : key :" + entry.getKey() + "---> value :"+entry.getValue());
}
}
/**
* description: 根据 key--value 键值对 找键和值 ( iterator 遍历)
*
* @param map
* @version v1.0
* @author w
* @date 2018年10月23日 下午5:19:01
*/
private void iteratorEntry(Map<Integer, String> map) {
Iterator<Entry<Integer, String>> iterator = map.entrySet().iterator();
while (iterator.hasNext()) {
Entry<Integer, String> entry = iterator.next();
//System.out.println("iteratorEntry : key :" + entry.getKey() + "---> value :"+entry.getValue());
}
}
/**/
private void lambadaEntry(Map<Integer, String> map) {
map.forEach((k, v) -> {
System.out.println("key:"+k+"values:"+v);
});
}
/*
* 通过Map.values()遍历所有的value,但不能遍历key
*/
private void mapValuesEntry(Map<Integer, String> map) {
for (Object m : map.values()) {
}
}
}
装载map耗时: 4119 ms
foreachKeyset 遍历 map耗时: 41 ms
foreachEntry 遍历 map耗时: 27 ms
iteratorEntry 遍历 map耗时: 25 ms
lambadaEntry 遍历 map耗时: 96 ms
mapValuesEntry 遍历 map耗时: 30 ms
1000000