Map 遍历效率比较

准备测试数据

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

遍历 Map 中的 key + value

1、通过 keySet 遍历整个 Map

  1)采用 Iterator 进行遍历

long start = System.currentTimeMillis();
		
Iterator<String> 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<String> 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<Entry<String, String>> 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<Entry<String, String>> entrys = map.entrySet();
for (Entry<String, String> 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<String> 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<String> 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<Entry<String, String>> 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<Entry<String, String>> entrys = map.entrySet();
for (Entry<String, String> entry : entrys) {
    key = entry.getKey();
}
		
long end = System.currentTimeMillis();
System.out.println("采用foreach遍历entrySet: " + (end - start) + " ms");

遍历 Map 中的 value

1、通过 keySet 进行遍历

  1)采用 Iterator 进行遍历

Iterator<String> 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<String> 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<Entry<String, String>> 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<Entry<String, String>> entrys = map.entrySet();
for (Entry<String, String> 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<String> 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<String> 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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值