A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 一直在路上 中级黑马   /  2013-5-6 08:15  /  1769 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 一直在路上 于 2013-5-6 08:19 编辑

[size=11.818181991577148px]这个是我以前学习的时候总结的一个帖子,贴出来看一下。

[size=11.818181991577148px]map的遍历有四种放肆,下面我对其分别罗列出来:
  1. import java.util.HashMap;  
  2. import java.util.Iterator;  
  3. import java.util.Map;  
  4.           
  5. public class Test {  
  6.           
  7.     public static void main(String[] args) {  
  8.                 Map<String, String> map = new HashMap<String, String>();  
  9.                 map.put("aa", "aaa");  
  10.                 map.put("bb", "bbb");  
  11.                 map.put("cc", "ccc");  
  12.           
  13.   
  14.         // 第一种:通过Map.keySet遍历key和value  
  15.                 System.out.println("第一种方式:-------->通过Map.keySet遍历key和value:");  
  16.                 for (String key : map.keySet()) {  
  17.                                 System.out.println("key= " + key + "  and  value= " + map.get(key));  
  18.                 }  
  19.                   
  20.              // 第二种:通过Map.entrySet使用iterator遍历key和value  
  21.         System.out.println("第二种方式:-------->通过Map.entrySet使用iterator遍历key和value:");  
  22.                 Iterator<Map.Entry<String, String>> it = map.entrySet().iterator();  
  23.                 while (it.hasNext()) {  
  24.             Map.Entry<String, String> entry = it.next();  
  25.           
  26.                     System.out.println("key= " + entry.getKey() + "  and  value= "  
  27.                             + entry.getValue());  
  28.         }  
  29.   
  30.               // 第三种:通过Map.entrySet遍历key和value  
  31.         System.out.println("第三种方式:-------->通过Map.entrySet遍历key和value:");  
  32.                 for (Map.Entry<String, String> entry : map.entrySet()) {  
  33.             System.out.println("key= " + entry.getKey() + "  and  value= "  
  34.                     + entry.getValue());  
  35.         }  
  36.   
  37.              // 第四种:通过Map.values()遍历所有的value,但是不能遍历键key  
  38.        System.out.println("第四种方式:-------->通过Map.values()遍历所有的value:");  
  39.                 for (String v : map.values()) {  
  40.             System.out.println("value= " + v);  
  41.                 }  
  42.     }  
  43.         }  
复制代码
[size=11.818181991577148px]结果如下:
  1. 第一种方式:-------->通过Map.keySet遍历key和value:
  2. key= aa  and  value= aaa
  3. key= bb  and  value= bbb
  4. key= cc  and  value= ccc
  5. 第二种方式:-------->通过Map.entrySet使用iterator遍历key和value:
  6. key= aa  and  value= aaa
  7. key= bb  and  value= bbb
  8. key= cc  and  value= ccc
  9. 第三种方式:-------->通过Map.entrySet遍历key和value:
  10. key= aa  and  value= aaa
  11. key= bb  and  value= bbb
  12. key= cc  and  value= ccc
  13. 第四种方式:-------->通过Map.values()遍历所有的value:
  14. value= aaa
  15. value= bbb
  16. value= ccc
复制代码
[size=11.818181991577148px]这四种方法都可以遍历map:
[size=11.818181991577148px]第一种是目前许多人最喜欢的一种方式,因为代码最少,看起来最简单,通过遍历keySet,再将key所对应的value查询出来,这里有一个二次取值的过程,所以并不推荐;
[size=11.818181991577148px]第二种和第三种原理是相同的,都是通过遍历Map.Entry的方式,将Entry中的key和value打印出来,第三种是比较推荐写法,因为采用jdk1.5后的遍历形式,代码看起来比较整洁;
[size=11.818181991577148px]第四种用的比较少了,因为我们大多数时候都是同时需要key和value的
[size=11.818181991577148px]综上所述,如果map里面内容比较少,其实采用哪种方式都可以,第一种和第三种相对简洁一些;但是一旦容量非常大时,更推荐采用第三种方式,相比于第一种将极大地节省性能。
[size=11.818181991577148px]测试性能程序:
  1. import java.util.HashMap;  
  2. import java.util.Map;  

  3. public class Test {  
  4.        
  5.             public static void main(String[] args) {  
  6.           
  7.                     long MAX = 100000L;  
  8.                     int TIMES = 10;  
  9.                      
  10.                     Map<String, String> map1 = new HashMap<String, String>();  
  11.                     Map<String, String> map2 = new HashMap<String, String>();

  12.                 for (long i = 0; i < MAX; i++){  
  13.                                 map1.put("a" + i, "aa" + i);  
  14.                                 map2.put("b" + i, "bb" + i);  
  15.                      }  
  16.                 
  17.                 String value = "";   
  18.                 String key= "";  
  19.                 long startTime, endTime;  
  20.                 double total = 0;  
  21.   
  22.   
  23.           
  24.                /**
  25.                 * 通过Map.keySet遍历key和value
  26.                 */
  27.                 for (int j = 0; j < TIMES; j++) {  
  28.           
  29.                     startTime = System.currentTimeMillis();  
  30.                     for (String temp : map1.keySet()) {  
  31.                         key = temp;  
  32.                         value = map1.get(key);  
  33.                     }  
  34.                     endTime = System.currentTimeMillis();  
  35.                     System.out.println("通过Map.keySet遍历key和value耗时 " + (endTime - startTime)  
  36.                             + " ms ");  
  37.                 }  
  38.                 
  39.                   
  40.                   
  41.               /**
  42.                *通过Map.entrySet遍历key和value  
  43.                */
  44.                     startTime = System.currentTimeMillis();  
  45.             for (Map.Entry<String, String> entry : map2.entrySet()) {  
  46.                         key = entry.getKey();  
  47.                         value = entry.getValue();  
  48.                     }  
  49.                     endTime = System.currentTimeMillis();  
  50.                     System.out.println("通过Map.entrySet遍历key和value耗时 " + (endTime - startTime)  
  51.                             + " ms ");  
  52.                 }  

  53.         }
复制代码
[size=11.818181991577148px]测试结果:
  1. 通过Map.keySet遍历key和value耗时 5 ms
  2. 通过Map.keySet遍历key和value耗时 3 ms
  3. 通过Map.keySet遍历key和value耗时 3 ms
  4. 通过Map.keySet遍历key和value耗时 3 ms
  5. 通过Map.keySet遍历key和value耗时 3 ms
  6. 通过Map.keySet遍历key和value耗时 3 ms
  7. 通过Map.keySet遍历key和value耗时 3 ms
  8. 通过Map.keySet遍历key和value耗时 4 ms
  9. 通过Map.keySet遍历key和value耗时 3 ms
  10. 通过Map.keySet遍历key和value耗时 3 ms
  11. 通过Map.entrySet遍历key和value耗时 7 ms
复制代码
[size=11.818181991577148px]如果把上面的数字改动的大一些,可能效果更明显,但是改大的话,电脑会卡死掉。

评分

参与人数 1技术分 +1 收起 理由
曹睿翔 + 1 很给力!

查看全部评分

2 个回复

倒序浏览
很好!!!!
回复 使用道具 举报
赞!赞!赞!赞!赞!赞!赞!赞!赞!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马