Map:遍歷與刪除

1.遍歷Map:

(1)通過map.keySet()拿到key,需要獲取value,再通過key獲取value。一般有兩種寫法,一種是使用iterator遍歷,一種是直接遍歷。示例代碼如下:
//直接遍歷
for (String key : mHashMap.keySet()) {
    value = mHashMap.get(key);
}
//iterator遍歷
for(Iterator<String> iterator = mHashMap.keySet().iterator(); iterator.hasNext();) {
    key = iterator.next();
    value = mHashMap.get(key);
}
(2)通過map.entrySet()一次性取出key和value,然後循環獲取數據。也有兩種寫法,一種是使用iterator遍歷,一種是直接遍歷。示例代碼如下:
//直接遍歷
for (Map.Entry<String, String> entry: mHashMap.entrySet()) {
    key = entry.getKey();
    value = entry.getValue();
}
//iterator遍歷
for (Iterator<Map.Entry<String,String>> iterator = mHashMap.entrySet().iterator(); iterator.hasNext();){
    entry = iterator.next();
    key = entry.getKey();
    value = entry.getValue();
}
(3)通過map.values(),不需要獲取key,只需要遍歷value的值。也有兩種寫法,一種是使用iterator遍歷,一種是直接遍歷。示例代碼如下:
//直接遍歷
for (String values : map.values()) {
}
//iterator遍歷
for(Iterator<String> iterator = mHashMap.values().iterator();iterator.hasNext();){
    value = iterator.next();
}
(4)性能對比:
  • 同時遍歷key與value時,keySet與entrySet方法的性能差異取決於key的具體情況,包括複雜度,離散度,衝突率等。entrySet一次性取出key與value是有性能損耗的,當這個損失小於HashMap查找value的開銷時,entrySet的性能優勢就會體現出來。當key是比較簡單或者是比較連貫的數據的時候,使用keySet會相對高效。但是如果隨着key的複雜化,entrySet更有優勢。所以一般建議使用entrySet,它相對來說,比較穩定。

  • 只遍歷key時,keySet方法更爲合適,因爲entrySet將無用的value也給取出來了,浪費了性能和空間。

  • 只遍歷value時,使用vlaues方法是最佳選擇,entrySet會略好於keySet方法。

  • 上面展示了兩種遍歷方式,直接遍歷性能會稍微好一點。

2.刪除操作

如果在遍歷的過程中,對數據進行刪除操作,就一定要使用Iterator,否則會拋出java.util.ConcurrentModificationException 異常。因爲在遍歷HashMap的元素過程中刪除了當前所在元素,下一個待訪問的元素的指針也由此丟失了。

3.注意事項:

迭代器遍歷時,每一次調用next(),至多隻能對容器進行一次修改(操作包括添加和刪除),否則會拋出java.util.ConcurrentModificationException 異常。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章