Java中HashMap遍历的两种方式

时间:2020-11-28 20:19:50
一。Java中遍历HashMap的两种方式
第一种:
  HashMap<String,String> keySetMap = new HashMap<String,String>();
  Iterator<String> keySetIterator = keySetMap.keySet().iterator();
   while (keySetIterator.hasNext()) {
      System.out.println(keySetMap.get(keySetIterator.next()));
   }

第二种:
  HashMap<String,String> entrySetMap=new HashMap<String,String>();
  Iterator<Entry<String,String>> entrySetIterator=entrySetMap.entrySet().iterator();
   while(entrySetIterator.hasNext()){
      Entry<String,String> entry=entrySetIterator.next();
      System.out.println(entry.getValue());
   }
二。哪种方式更好?
HashMap的遍历有两种常用的方法,那就是使用keyset和entryset来进行遍历,但两者的遍历速度是有差别的,到底哪一种方式更好呢?测试一下就知道了。下面请看实例:
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map.Entry;

public class HashMapTest {
    public static void main(String[] args) {
        HashMap<String,String> keySetMap = new HashMap<String,String>();
        HashMap<String,String> entrySetMap=new HashMap<String,String>();
        
        for (int i= 0;i<1000;i++) {
            keySetMap.put(""+i, "keySet");
        }
        for(int i=0;i<1000;i++){
            entrySetMap.put(""+i,"entrySet");
        }
        
        long startTimeOne = System.currentTimeMillis();
        Iterator<String> keySetIterator = keySetMap.keySet().iterator();
        while (keySetIterator.hasNext()) {
            System.out.println(keySetMap.get(keySetIterator.next()));
        }
        System.out.println("keyset遍历时间:"+(System.currentTimeMillis()-startTimeOne));
        
        long startTimeTwo=System.currentTimeMillis();
        Iterator<Entry<String,String>> entrySetIterator=entrySetMap.entrySet().iterator();
        while(entrySetIterator.hasNext()){
            Entry<String,String> entry=entrySetIterator.next();
            System.out.println(entry.getValue());
        }
        System.out.println("entryset遍历时间:"+(System.currentTimeMillis()-startTimeTwo));
    }
}
通过多次运行测试发现,entryset遍历时间比keyset遍历时间短许多,entryset方式的性能通常要比keyset方式高一倍。
三。原因何在?
  通过查看源代码发现,调用keySetMap.keySet()这个方法会生成keyIterator迭代器,其next()方法只返回其key值,然后再通过key值在keySetMap中获得其value值,代码如:keySetMap.get(keySetIterator.next())
  而调用entrySetMap.entrySet()方法会生成EntryIterator迭代器,其next()方法返回一个Entry对象的一个实例,其中包含key值和value值。
  如果遍历HashMap时只取其key值,那么两种方式的遍历在性能上应该是相同的。但同时取key值和value值时,keyset方式比entryset方式多遍历了一次table,此时keyset方式性能差些。