1. 程式人生 > >keySet 與entrySet 遍歷HashMap效能差別原因

keySet 與entrySet 遍歷HashMap效能差別原因

1.兩種遍歷方法

1.1

Iterator<String> keySetIterator = keySetMap.keySet().iterator();   
while (keySetIterator.hasNext()) {   
    String key = keySetIterator.next();   
    String value = keySetMap.get(key);           
}

1.2

Iterator<Entry<String, String>> entryKeyIterator = entrySetMap.entrySet().iterator();   
while
(entryKeyIterator.hasNext()) { Entry<String, String> e = entryKeyIterator.next(); String value=e.getValue(); }

2.效能差別及原因

Entry方法通常要比key方法快一倍,原因如下:

呼叫keySetMap.keySet()會生成KeyIterator迭代器,其next方法只返回其key值。Java程式碼如下:

private class KeyIterator extends HashIterator<K> { 
        public
K next() { return nextEntry().getKey(); } }

而呼叫entrySetMap.entrySet()方法會生成EntryIterator 迭代器,其next方法返回一個Entry物件的一個例項,其中包含key和value。Java程式碼如下:

private class EnteyIterator extends HashIterator<Map.Entry<K,V>> {
    public Map.Entry<K,V> next() {
        return
nextEntry(); } }

二者在此時的效能應該是相同的,但方式一再取得key所對應的value時,此時還要訪問Map的這個方法,這時,方式一多遍歷了一次table。因此二者效能存在一倍的差異。