本帖最后由 一直在路上 于 2013-5-6 08:19 编辑
[size=11.818181991577148px]这个是我以前学习的时候总结的一个帖子,贴出来看一下。
[size=11.818181991577148px]map的遍历有四种放肆,下面我对其分别罗列出来: - import java.util.HashMap;
- import java.util.Iterator;
- import java.util.Map;
-
- public class Test {
-
- public static void main(String[] args) {
- Map<String, String> map = new HashMap<String, String>();
- map.put("aa", "aaa");
- map.put("bb", "bbb");
- map.put("cc", "ccc");
-
-
- // 第一种:通过Map.keySet遍历key和value
- System.out.println("第一种方式:-------->通过Map.keySet遍历key和value:");
- for (String key : map.keySet()) {
- System.out.println("key= " + key + " and value= " + map.get(key));
- }
-
- // 第二种:通过Map.entrySet使用iterator遍历key和value
- System.out.println("第二种方式:-------->通过Map.entrySet使用iterator遍历key和value:");
- Iterator<Map.Entry<String, String>> it = map.entrySet().iterator();
- while (it.hasNext()) {
- Map.Entry<String, String> entry = it.next();
-
- System.out.println("key= " + entry.getKey() + " and value= "
- + entry.getValue());
- }
-
- // 第三种:通过Map.entrySet遍历key和value
- System.out.println("第三种方式:-------->通过Map.entrySet遍历key和value:");
- for (Map.Entry<String, String> entry : map.entrySet()) {
- System.out.println("key= " + entry.getKey() + " and value= "
- + entry.getValue());
- }
-
- // 第四种:通过Map.values()遍历所有的value,但是不能遍历键key
- System.out.println("第四种方式:-------->通过Map.values()遍历所有的value:");
- for (String v : map.values()) {
- System.out.println("value= " + v);
- }
- }
- }
复制代码 [size=11.818181991577148px]结果如下:- 第一种方式:-------->通过Map.keySet遍历key和value:
- key= aa and value= aaa
- key= bb and value= bbb
- key= cc and value= ccc
- 第二种方式:-------->通过Map.entrySet使用iterator遍历key和value:
- key= aa and value= aaa
- key= bb and value= bbb
- key= cc and value= ccc
- 第三种方式:-------->通过Map.entrySet遍历key和value:
- key= aa and value= aaa
- key= bb and value= bbb
- key= cc and value= ccc
- 第四种方式:-------->通过Map.values()遍历所有的value:
- value= aaa
- value= bbb
- 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]测试性能程序:- import java.util.HashMap;
- import java.util.Map;
- public class Test {
-
- public static void main(String[] args) {
-
- long MAX = 100000L;
- int TIMES = 10;
-
- Map<String, String> map1 = new HashMap<String, String>();
- Map<String, String> map2 = new HashMap<String, String>();
- for (long i = 0; i < MAX; i++){
- map1.put("a" + i, "aa" + i);
- map2.put("b" + i, "bb" + i);
- }
-
- String value = "";
- String key= "";
- long startTime, endTime;
- double total = 0;
-
-
-
- /**
- * 通过Map.keySet遍历key和value
- */
- for (int j = 0; j < TIMES; j++) {
-
- startTime = System.currentTimeMillis();
- for (String temp : map1.keySet()) {
- key = temp;
- value = map1.get(key);
- }
- endTime = System.currentTimeMillis();
- System.out.println("通过Map.keySet遍历key和value耗时 " + (endTime - startTime)
- + " ms ");
- }
-
-
-
- /**
- *通过Map.entrySet遍历key和value
- */
- startTime = System.currentTimeMillis();
- for (Map.Entry<String, String> entry : map2.entrySet()) {
- key = entry.getKey();
- value = entry.getValue();
- }
- endTime = System.currentTimeMillis();
- System.out.println("通过Map.entrySet遍历key和value耗时 " + (endTime - startTime)
- + " ms ");
- }
- }
-
复制代码 [size=11.818181991577148px]测试结果:- 通过Map.keySet遍历key和value耗时 5 ms
- 通过Map.keySet遍历key和value耗时 3 ms
- 通过Map.keySet遍历key和value耗时 3 ms
- 通过Map.keySet遍历key和value耗时 3 ms
- 通过Map.keySet遍历key和value耗时 3 ms
- 通过Map.keySet遍历key和value耗时 3 ms
- 通过Map.keySet遍历key和value耗时 3 ms
- 通过Map.keySet遍历key和value耗时 4 ms
- 通过Map.keySet遍历key和value耗时 3 ms
- 通过Map.keySet遍历key和value耗时 3 ms
- 通过Map.entrySet遍历key和value耗时 7 ms
复制代码 [size=11.818181991577148px]如果把上面的数字改动的大一些,可能效果更明显,但是改大的话,电脑会卡死掉。 |