HashMap的遍历两种常用的方法,那就是使用keyset及entryset来进行遍历

来源:互联网 发布:中国少儿编程网 编辑:程序博客网 时间:2024/05/17 14:19
 

第一种: 

Map map = new HashMap(); 

Iterator iter = map.entrySet().iterator(); 

while (iter.hasNext()) { 

    Map.Entry entry = (Map.Entry) iter.next(); 

    Object key = entry.getKey(); 

    Object val = entry.getValue(); 

效率高,以后一定要使用此种方式! 

第二种: 

Map map = new HashMap(); 

Iterator iter = map.keySet().iterator(); 

while (iter.hasNext()) { 

    Object key = iter.next(); 

    Object val = map.get(key); 

效率低,以后尽量少使用! 


例: 

HashMap的遍历有两种常用的方法,那就是使用keyset及entryset来进行遍历,但两者的遍历速度是有差别的,下面请看实例: 


public class HashMapTest { 

public static void main(String[] args) ...{ 

  HashMap hashmap = new HashMap(); 

  for (int i = 0; i < 1000; i ) ...{ 

   hashmap.put("" i, "thanks"); 

  } 


  long bs = Calendar.getInstance().getTimeInMillis(); 

  Iterator iterator = hashmap.keySet().iterator();  

  while (iterator.hasNext()) ...{   

   System.out.print(hashmap.get(iterator.next())); 

  } 

  System.out.println(); 

  System.out.println(Calendar.getInstance().getTimeInMillis() - bs); 

  listHashMap(); 


  public static void listHashMap() ...{ 

  java.util.HashMap hashmap = new java.util.HashMap(); 

  for (int i = 0; i < 1000; i ) ...{ 

   hashmap.put("" i, "thanks"); 

  } 

  long bs = Calendar.getInstance().getTimeInMillis();  

  java.util.Iterator it = hashmap.entrySet().iterator(); 

  while (it.hasNext()) ...{ 

   java.util.Map.Entry entry = (java.util.Map.Entry) it.next(); 

   // entry.getKey() 返回与此项对应的键 

   // entry.getValue() 返回与此项对应的值 

   System.out.print(entry.getValue()); 

  } 

  System.out.println(); 

  System.out.println(Calendar.getInstance().getTimeInMillis() - bs); 


对于keySet其实是遍历了2次,一次是转为iterator,一次就从hashmap中取出key所对于的value。而entryset只是遍历了第一次,他把key和value都放到了entry中,所以就快了。 


到底keyset快还是entryset快,这个例子输出太多影响效果,改一下例子。


Java代码 

1.public class HashMapTest {       

2.    private static int MAXKEY = 1234567;   

3.    public static void main(String[] args) {   

4.        HashMap hashmap = new HashMap();   

5.        for (int i = 0; i < HashMapTest.MAXKEY; i++) {   

6.            hashmap.put(i, "thanks");   

7.        }   

8.        long bs = Calendar.getInstance().getTimeInMillis();   

9.        Iterator iterator = hashmap.keySet().iterator();   

10.        while (iterator.hasNext()) {   

11.            Object key = iterator.next();   

12.            Object value = hashmap.get(key);   

13.        }   

14.        System.out.print(Calendar.getInstance().getTimeInMillis() - bs + ",");   

15.        listHashMap();   

16.    }   

17.  

18.    public static void listHashMap() {   

19.        HashMap hashmap = new java.util.HashMap();   

20.        for (int i = 0; i < HashMapTest.MAXKEY; i++) {   

21.            hashmap.put(i, "thanks");   

22.        }   

23.        long bs = Calendar.getInstance().getTimeInMillis();   

24.        Iterator it = hashmap.entrySet().iterator();   

25.        Map.Entry entry;   

26.        while (it.hasNext()) {   

27.            entry = (java.util.Map.Entry) it.next();   

28.            Object key = entry.getKey();   

29.            Object value = entry.getValue();   

30.            //Object value = hashmap.get(key);   

31.        }   

32.        System.out.print(Calendar.getInstance().getTimeInMillis() - bs);   

33.    }   

34.}  

public class HashMapTest {    

    private static int MAXKEY = 1234567;

    public static void main(String[] args) {

        HashMap hashmap = new HashMap();

        for (int i = 0; i < HashMapTest.MAXKEY; i++) {

            hashmap.put(i, "thanks");

        }

        long bs = Calendar.getInstance().getTimeInMillis();

        Iterator iterator = hashmap.keySet().iterator();

        while (iterator.hasNext()) {

            Object key = iterator.next();

            Object value = hashmap.get(key);

        }

        System.out.print(Calendar.getInstance().getTimeInMillis() - bs + ",");

        listHashMap();

    }


    public static void listHashMap() {

        HashMap hashmap = new java.util.HashMap();

        for (int i = 0; i < HashMapTest.MAXKEY; i++) {

            hashmap.put(i, "thanks");

        }

        long bs = Calendar.getInstance().getTimeInMillis();

        Iterator it = hashmap.entrySet().iterator();

        Map.Entry entry;

        while (it.hasNext()) {

            entry = (java.util.Map.Entry) it.next();

            Object key = entry.getKey();

            Object value = entry.getValue();

            //Object value = hashmap.get(key);

        }

        System.out.print(Calendar.getInstance().getTimeInMillis() - bs);

    }

}


    /* 

     * 先来测测,i为1234567时,输出 63,47  47,47  63,47 测了三次 

     * 改一下代码,listHashMap方法的while循环中,Object value = hashmap.get(key) 

     * 再测,63,79  47,78  63,79  三次 

     */ 

keySet比entrySet慢吗? 

keySet第一次遍历获得所有key,entrySet第一次遍历获得所有key和value,这一步显然entrySet会慢,看下一步。 

iterator之后,keySet的next()是key,entrySet的next()是Map.Entry(包含了key和value)。 

改变代码之后的测试表明,entrySet的getValue()比Map的get()确实快(虽然不知道它们内部是怎样的原理实现,虽然有人说Map的get()消耗很小)。当然,没有理由使用更改后的代码,别误导了。 

于是,我想entrySet()貌似是快一些,把第一次遍历的获得同时得到key和value多花的时间抢回来了。 


不过要按key排序的话,似乎keySet更方便一些。


Java代码 

1.Object[] key_arr = hashmap.keySet().toArray();   

2.Arrays.sort(key_arr);   

3.for (Object key : key_arr) {   

4.    Object value = hashmap.get(key);   

5.}