Map 遍历效率比较

准备测试数据

Map 中添加 1000000 条数据,key、value 都是 String 类型的字符串。

遍历 Map 中的 key + value

1、通过 keySet 遍历整个 Map

  1)采用 Iterator 进行遍历

long start = System.currentTimeMillis();
		
Iterator iter = map.keySet().iterator();
while (iter.hasNext()) {
    key = iter.next();
    value = map.get(key);
}
		
long end = System.currentTimeMillis();
System.out.println("采用iterator遍历keySet: " + (end - start) + " ms");

  2)采用 foreach 进行遍历

long start = System.currentTimeMillis();
		
Set keys = map.keySet();
for (String key : keys) {
    value = map.get(key);
}

long end = System.currentTimeMillis();
System.out.println("采用foreach遍历keySet: " + (end - start) + " ms");

2、通过 entrySet 遍历整个 Map

  1)采用 Iterator 进行遍历

long start = System.currentTimeMillis();
		
Iterator> iter = map.entrySet().iterator();
while (iter.hasNext()) {
    entry = iter.next();
    key = entry.getKey();
    value = entry.getValue();
}
		
long end = System.currentTimeMillis();
System.out.println("采用iterator遍历entrySet: " + (end - start) + " ms");

  2)采用 foreach 进行遍历

long start = System.currentTimeMillis();
		
Set> entrys = map.entrySet();
for (Entry entry : entrys) {
    key = entry.getKey();
    value = entry.getValue(); 
}
		
long end = System.currentTimeMillis();
System.out.println("采用foreach遍历entrySet: " + (end - start) + " ms");

遍历 Map 中的 key

1、通过 keySet 遍历整个 Map

  2)采用 Iterator 进行遍历

long start = System.currentTimeMillis();
		
Iterator iter = map.keySet().iterator();
while (iter.hasNext()) {
    key = iter.next();
}
		
long end = System.currentTimeMillis();
System.out.println("采用iterator遍历keySet: " + (end - start) + " ms");

  2)采用 foreach 进行遍历

long start = System.currentTimeMillis();
		
Set keys = map.keySet();
for (String key : keys) {
}
		
long end = System.currentTimeMillis();
System.out.println("采用foreach遍历keySet: " + (end - start) + " ms");

2、通过 entrySet 遍历整个 Map

  1)采用 Iterator 进行遍历

long start = System.currentTimeMillis();
		
Iterator> iter = map.entrySet().iterator();
while (iter.hasNext()) {
    key = iter.next().getKey();
}
		
long end = System.currentTimeMillis();
System.out.println("采用iterator遍历entrySet: " + (end - start) + " ms");

  2)采用 foreach 进行遍历

long start = System.currentTimeMillis();
		
Set> entrys = map.entrySet();
for (Entry entry : entrys) {
    key = entry.getKey();
}
		
long end = System.currentTimeMillis();
System.out.println("采用foreach遍历entrySet: " + (end - start) + " ms");

遍历 Map 中的 value

1、通过 keySet 进行遍历

  1)采用 Iterator 进行遍历

Iterator iter = map.keySet().iterator();
while (iter.hasNext()) {
    value = map.get(iter.next());
}
		
long end = System.currentTimeMillis();
System.out.println("采用iterator遍历keySet: " + (end - start) + " ms");

  2)采用 foreach 进行遍历

long start = System.currentTimeMillis();
		
Set keys = map.keySet();
for (String key : keys) {
    value = map.get(key);
}
		
long end = System.currentTimeMillis();
System.out.println("采用foreach遍历keySet: " + (end - start) + " ms");

2、通过 entrySet 进行遍历

  1)采用 Iterator 进行遍历

long start = System.currentTimeMillis();
		
Iterator> iter = map.entrySet().iterator();
while (iter.hasNext()) {
    value = iter.next().getValue();
}
		
long end = System.currentTimeMillis();
System.out.println("采用iterator遍历entrySet: " + (end - start) + " ms");

  2)采用 foreach 进行遍历

long start = System.currentTimeMillis();
		
Set> entrys = map.entrySet();
for (Entry entry : entrys) {
    value = entry.getValue();
}
		
long end = System.currentTimeMillis();
System.out.println("采用foreach遍历entrySet: " + (end - start) + " ms");

3、通过 values 进行遍历

  1)采用 Iterator 进行遍历

long start = System.currentTimeMillis();
		
Iterator iter = map.values().iterator();
while (iter.hasNext()) {
    value = iter.next();
}
		
long end = System.currentTimeMillis();
System.out.println("采用iterator遍历values " + (end - start) + " ms");

  2)采用 foreach 进行遍历

long start = System.currentTimeMillis();
		
Collection coll = map.values();
for (String value : coll) {
}
		
long end = System.currentTimeMillis();
System.out.println("采用foreach遍历values: " + (end - start) + " ms");

结果:

1、

-----遍历Map的key+value-----
采用iterator遍历keySet: 56 ms
采用foreach遍历keySet: 47 ms
采用iterator遍历entrySet: 28 ms
采用foreach遍历entrySet: 27 ms
-----遍历Map的key-----
采用iterator遍历keySet: 27 ms
采用foreach遍历keySet: 21 ms
采用iterator遍历entrySet: 21 ms
采用foreach遍历entrySet: 21 ms
-----遍历Map的value-----
采用iterator遍历keySet: 34 ms
采用foreach遍历keySet: 44 ms
采用iterator遍历entrySet: 27 ms
采用foreach遍历entrySet: 26 ms
采用iterator遍历values 26 ms
采用foreach遍历values: 27 ms

2、

-----遍历Map的key+value-----
采用iterator遍历keySet: 53 ms
采用foreach遍历keySet: 46 ms
采用iterator遍历entrySet: 30 ms
采用foreach遍历entrySet: 27 ms
-----遍历Map的key-----
采用iterator遍历keySet: 22 ms
采用foreach遍历keySet: 20 ms
采用iterator遍历entrySet: 24 ms
采用foreach遍历entrySet: 21 ms
-----遍历Map的value-----
采用iterator遍历keySet: 43 ms
采用foreach遍历keySet: 41 ms
采用iterator遍历entrySet: 25 ms
采用foreach遍历entrySet: 24 ms
采用iterator遍历values 28 ms
采用foreach遍历values: 21 ms

3、

-----遍历Map的key+value-----
采用iterator遍历keySet: 55 ms
采用foreach遍历keySet: 46 ms
采用iterator遍历entrySet: 31 ms
采用foreach遍历entrySet: 28 ms
-----遍历Map的key-----
采用iterator遍历keySet: 26 ms
采用foreach遍历keySet: 27 ms
采用iterator遍历entrySet: 24 ms
采用foreach遍历entrySet: 26 ms
-----遍历Map的value-----
采用iterator遍历keySet: 42 ms
采用foreach遍历keySet: 42 ms
采用iterator遍历entrySet: 26 ms
采用foreach遍历entrySet: 26 ms
采用iterator遍历values 27 ms
采用foreach遍历values: 26 ms

结论:

1、使用 Iterator 和 foreach 本质上速度差不多,foreach 底层也是使用 Iterator 进行的。

2、如果只遍历 Map 中的 key 的话,可以使用 keySet。

3、如果只遍历 Map 中的 value 的话,可以使用 values。

4、使用 entrySet 遍历 Map 速度真的很快,建议使用 entrySet遍历 Map 集合。

源码:

https://github.com/dontsaoqi/testMap

你可能感兴趣的:(Map 遍历效率比较)