1. 程式人生 > >【技術累積】【點】【java】【28】Map遍歷

【技術累積】【點】【java】【28】Map遍歷

兩種 bject amp urn 明顯 for object 一次 keyset

Map遍歷

map的遍歷一般有幾種吧

  • 遍歷entrySet
for(Map.Entry<String,String> entry : map.entrySet()){
    
}

Iterator<Map.Entry<String,String>> it = map.entrySet().iterator();
while(it.hasNext()){
    
}
  • 遍歷keySet
for(String key : map.keySet()){
    
}

//iterator同上
  • 遍歷valueSet
for(String value : map.valueSet()){
    
}

//iterator同上

選擇

從書寫上來看,後兩種要更簡單些;

但是考慮下map遍歷的場景:

  • 根據key值拿value

所以keySet和entrySet更經常使用吧;

for(Map.Entry<String,String> entry : map.entrySet()){
    entry.getKey();
}

for(String key : map.keySet()){
    map.get(key);
}

但是,從性能角度講,推薦使用entrySet

因為,keySet拿value的時候又一次遍歷的map,每次取用都多一次開銷,對於大容量的Map來說,性能差異也比較明顯。

public V get(Object key) {
        if (key == null)
            return getForNullKey();
        Entry<K,V> entry = getEntry(key);

        return null == entry ? null : entry.getValue();
    } 
final Entry<K,V> getEntry(Object key) {
        if (size == 0) {
            return null;
        }

        int hash = (key == null) ? 0 : hash(key);
        for (Entry<K,V> e = table[indexFor(hash, table.length)];
             e != null;
             e = e.next) {
            Object k;
            if (e.hash == hash &&
                ((k = e.key) == key || (key != null && key.equals(k))))
                return e;
        }
        return null;
    }

參考文章

  • Map對象中keyset()和entryset()區別
  • Map遍歷的keySet()和entrySet()性能差異原因
  • Map集合的四種遍歷方式

【技術累積】【點】【java】【28】Map遍歷