天天看點

hashmap 周遊

一。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方式性能差些。