ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

不同方式遍历Map集合的效率比较

2021-02-21 20:01:06  阅读:296  来源: 互联网

标签:Map 遍历 map entrySet System long currentTimeMillis 集合


首发于本人的CSDN:点这访问https://blog.csdn.net/weixin_43438052/article/details/113919663

测试用例

//HashMap1:大小为1000000,
//key和value的值均为String,
//key的值为1、2、3.........1000000
Map<String,String> map1 =new HashMap<String,String>();
String key1,value1;
for(int i=1;i<=1000000;i++){
    key1 = ""+i;
    value1="value"+i;
    map1.put(key1,value1);
}

//HashMap2:大小为1000000,
//key和value的值为String,
//key的值为50、100、150........50000000
Map<String,String> map2 = new HashMap<String,String>();
String key2,value2;
for(int i=1;i<=1000000;i++){
    key2=""+(i*50);
    value2="value"+key2;
    map2.put(key2,value2);
}

测试场景

同时遍历 key+value

keySet利用Iterator遍历

public static long keySet_Iterator(Map<String, String> map) {
    long startTime1 =System.currentTimeMillis();
    Iterator<String> iter = map.keySet().iterator();
    while (iter.hasNext()){
        key=iter.next();
        value=map.get(key);
    }
    long endTime1 =System.currentTimeMillis();
    return endTime1-startTime1;
}

keySet利用for遍历

public static long keySet_for(Map<String, String> map) {
    long startTime2 =System.currentTimeMillis();
    for(String key3:map.keySet()){
        value=map.get(key3);
    }
    long endTime2 =System.currentTimeMillis();
    return endTime2-startTime2;
}

entrySet利用Iterator遍历

public static long entrySet_Iterator(Map<String, String> map) {
    long startTime3=System.currentTimeMillis();
    Iterator<Map.Entry<String,String>> iter3 =map.entrySet().iterator();
    Map.Entry<String,String> entry3;
    while (iter3.hasNext()){
        entry3 = iter3.next();
        key = entry3.getKey();
        value=entry3.getValue();
    }
    long endTime3 =System.currentTimeMillis();
    return endTime3-startTime3;
}

entrySet利用for遍历

public static long entrySet_for(Map<String, String> map) {
    long startTime4=System.currentTimeMillis();
    for(Map.Entry<String,String> entry4:map.entrySet()){
        key=entry4.getKey();
        value=entry4.getValue();
    }
    long endTime4 =System.currentTimeMillis();
    return endTime4-startTime4;
}

只遍历 key

keySet利用Iterator遍历

public static long keySet_Iterator(Map<String, String> map) {
    long startTime1 =System.currentTimeMillis();
    Iterator<String> iter = map.keySet().iterator();
    while (iter.hasNext()){
    	key=iter.next();
    }
    long endTime1 =System.currentTimeMillis();
    return endTime1-startTime1;
}

keySet利用for遍历

public static long keySet_for(Map<String, String> map) {
    long startTime2 =System.currentTimeMillis();
    for(String key3:map.keySet()){
	
    }
    long endTime2 =System.currentTimeMillis();
    return endTime2-startTime2;
}

entrySet利用Iterator遍历

public static long entrySet_Iterator(Map<String, String> map) {
    long startTime3=System.currentTimeMillis();
    Iterator<Map.Entry<String,String>> iter3 =map.entrySet().iterator();
    Map.Entry<String,String> entry3;
    while (iter3.hasNext()){
    	key = iter3.next().getKey();
    }
    long endTime3 =System.currentTimeMillis();
    return endTime3-startTime3;
}

entrySet利用for遍历

public static long entrySet_for(Map<String, String> map) {
    long startTime4=System.currentTimeMillis();
    for(Map.Entry<String,String> entry4:map.entrySet()){
	    key=entry4.getKey();
    }
    long endTime4 =System.currentTimeMillis();
    return endTime4-startTime4;
}

只遍历 value

keySet利用Iterator遍历

public static long keySet_Iterator(Map<String, String> map) {
    long startTime1 =System.currentTimeMillis();
    Iterator<String> iter = map.keySet().iterator();
    while (iter.hasNext()){
		value=map.get(iter.next());
    }
    long endTime1 =System.currentTimeMillis();
    return endTime1-startTime1;
}

keySet利用for遍历

public static long keySet_for(Map<String, String> map) {
    long startTime2 =System.currentTimeMillis();
    for(String key3:map.keySet()){
        value=map.get(key2);
    }
    long endTime2 =System.currentTimeMillis();
    return endTime2-startTime2;
}

entrySet利用Iterator遍历

public static long entrySet_Iterator(Map<String, String> map) {
    long startTime3=System.currentTimeMillis();
    Iterator<Map.Entry<String,String>> iter3 =map.entrySet().iterator();
    Map.Entry<String,String> entry3;
    while (iter3.hasNext()){
		value=iter3.next().getValue();
    }
    long endTime3 =System.currentTimeMillis();
    return endTime3-startTime3;
}

entrySet利用for遍历

public static long entrySet_for(Map<String, String> map) {
    long startTime4=System.currentTimeMillis();
    for(Map.Entry<String,String> entry4:map.entrySet()){
		value=entry4.getValue();
    }
    long endTime4 =System.currentTimeMillis();
    return endTime4-startTime4;
}

values利用iterator遍历

public static values_Iterator(Map<String, String> map) {
    long startTime5=System.currentTimeMillis();
    Iterator<String>  iter5=map.values().iterator();
    while (iter5.hasNext()){
        value=iter5.next();
    }
    long endTime5 =System.currentTimeMillis();
    return endTime5-startTime5;
}

values利用for遍历

public static values_for(Map<String, String> map) {
	long startTime6=System.currentTimeMillis();
    for(String value6:map.values()){

    }
    long endTime6 =System.currentTimeMillis();
    return endTime6-startTime6;
}

测试结果

同时遍历 key+value

同时遍历 key+value 数据量小 数据量大
keySet利用Iterator遍历 124ms 126ms
keySet利用for遍历 105ms 113ms
entrySet利用Iterator遍历 80ms 100ms
entrySet利用for遍历 78ms 103ms

只遍历 key

只遍历 key 数据量小 数据量大
keySet利用Iterator遍历 97ms 118ms
keySet利用for遍历 93ms 114ms
entrySet利用Iterator遍历 95ms 115ms
entrySet利用for遍历 95ms 113ms

只遍历 value

只遍历 value 数据量小 数据量大
keySet利用Iterator遍历 125ms 146ms
keySet利用for遍历 114ms 140ms
entrySet利用Iterator遍历 102ms 120ms
entrySet利用for遍历 104ms 121ms
values利用iterator遍历 97ms 124ms
values利用for遍历 107ms 114ms

小结

  1. map的key采用简单形式和复杂形式时,查找的效率是不同的,简单的key值效率更高
  2. 当数据量大的时候,采用entrySet遍历key+value的效率要高于keySet

这也是为什么“大家建议使用entrySet,认为entrySet对于大数据量的查找来说,速度更快”

  1. 当我们只需要取得value值时,采用values来遍历效率更高

标签:Map,遍历,map,entrySet,System,long,currentTimeMillis,集合
来源: https://www.cnblogs.com/melodyjerry/p/14426914.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有