午夜秒播伦理片

老鼠哥|网络站长门户网,PHP工程师,PHP教程,PHP100,PHP源码,PHP程序员
  • 老鼠哥网络站长门户改版新上线
  • 欢迎您老鼠哥网络门户网
  • 老鼠哥网络站长门户改版新上线
  • 欢迎您老鼠哥网络门户网

Java中遍历大容量map的正确方法

出处:老鼠哥站长网 作者:老鼠哥 日期:2012-12-26 06:57 浏览:次
首先,遍历map有以下方法: import java.util.HashMap; import java.util.Iterator; import java.util.Map; public class MapTe

首先,遍历map有以下方法

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
public class MapTest {

 public static void main(String[] args) {
  Map<String, String> map = new HashMap<String, String>();
  map.put("1", "1");
  map.put("2", "2");
  map.put("3", "3");


  // 第一种:通过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);
  }
 }

}
结果如下:

通过Map.keySet遍历key和value:
key= 3  and  value= 3
key= 2  and  value= 2
key= 1  and  value= 1
通过Map.entrySet使用iterator遍历key和value:
key= 3  and  value= 3
key= 2  and  value= 2
key= 1  and  value= 1
通过Map.entrySet遍历key和value:
key= 3  and  value= 3
key= 2  and  value= 2
key= 1  and  value= 1
通过Map.values()遍历所有的value:
value= 3
value= 2
value= 1
这四种方法都可以遍历map:

第一种是目前许多人最喜欢的一种方式,因为代码最少,看起来最简单,通过遍历keySet,再将key所对应的value查询出来,这里有一个二次取值的过程,所以并不推荐;

第二种和第三种原理是相同的,都是通过遍历Map.Entry的方式,将Entry中的key和value打印出来,第三种是比较推荐写法,因为采用jdk1.5后的遍历形式,代码看起来比较整洁;

午夜秒播伦理片 第四种比较少用,因为我们大多数时候都是同时需要key和value的

综上所述,如果map里面内容比较少,其实采用哪种方式都可以,第一种和第三种相对简洁一些;但是一旦容量非常大时,更推荐采用第三种方式,相比于第一种将极大地节省性能。

修改一下代码,对执行时间执行一下测试:

import java.util.HashMap;
import java.util.Map;

public class MapTest {
 static long MAX_LONG = 1000000L;
 static int TIMES = 10;
 static Map<String, String> map1 = new HashMap<String, String>();
 static Map<String, String> map2 = new HashMap<String, String>();
 static {
  for (long i = 0; i < MAX_LONG; i++) {
   map1.put("1" + i, "abc" + i);
   map2.put("2" + i, "def" + i);
  }
 }

午夜秒播伦理片  public static void main(String[] args) {

  String valueStr = "";
  String keyStr = "";
  long start, end;
午夜秒播伦理片   double totalMs;

 

  totalMs = 0;
午夜秒播伦理片   for (int i = 0; i < TIMES; i++) {

   // 通过Map.keySet遍历key和value
   start = System.currentTimeMillis();
   for (String key : map1.keySet()) {
    keyStr = key;
    valueStr = map1.get(key);
   }
   end = System.currentTimeMillis();
   System.out.println("通过Map.keySet遍历key和value耗时 " + (end - start)
     + " ms ");
   totalMs += (end - start);
  }
  System.out.println("Times : " + TIMES + ", totalMs : " + totalMs
    + "ms, average :" + totalMs / TIMES + "ms");
  
  
  totalMs = 0;
  for (int i = 0; i < TIMES; i++) {
   // 通过Map.entrySet遍历key和value
   start = System.currentTimeMillis();
   for (Map.Entry<String, String> entry : map2.entrySet()) {
    keyStr = entry.getKey();
    valueStr = entry.getValue();
   }
   end = System.currentTimeMillis();
   System.out.println("通过Map.entrySet遍历key和value耗时 " + (end - start)
     + " ms ");
   totalMs += (end - start);
  }
  System.out.println("Times : " + TIMES + ", totalMs : " + totalMs
    + "ms, average :" + totalMs / TIMES + "ms");

 }

}
午夜秒播伦理片 以下是测试结果:

顶一下
(0)
0%
踩一下
(0)
0%
最新评论
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
验证码:点击我更换图片

午夜秒播伦理片