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