Map最佳實踐

今天的主題是map和一些錯誤的使用。我們通過減少map的hash來進行優化,這些方法都會進行一次hash,比如get, containsKey, put等等。

我們以前可能出現的代碼

if (map.containsKey(key)) { // one hash
    return map.get(key); // two hash
}
List<String> list = new ArrayList<>();
map.put(key, list); // three hash
return list;

它也是最慢的。每次訪問Map都會有哈希算法產生,目標是儘可能降低哈希,更好的方法是:

List<String> list = map.get(key); // one hash
if(list == null) {
    list = new ArrayList<>();
    map.put(key, list); // two hash
}
return list;

只需要保存一個哈希。

重要提示:如果值null是可能無效,但我強烈建議你永遠不要有空值。

但是從Java 8開始,你有三個更好的解決方案:

第一個是:

map.putIfAbsent(key, new ArrayList<>()); // one hash
return map.get(key); // two hash

還會有兩個哈希。而ArrayList需要被實例化,即使它已經在Map上。

可以用更長的代碼來改進:

List<String> list = new ArrayList<>();
List<String> result = map.putIfAbsent(key, list); // one hash only!
if(result == null) {
    return list;
}
return result;

只有一個哈希!但ArrayList仍然有無用地實例化。

另一個Java 8方法來實現這一目標:

return map.computeIfAbsent(key, unused -> new ArrayList<>()); // one hash only!

我們可以獲得一行代碼並且效率最好的。ArrayList在需要的時候將進行實例化。

重要提示:不要這樣做:map.computeIfAbsent(key, ArrayList::new) computeIfAbsent採用Function<KEY, VALUE>參數。因此,除非KEY匹配其中一個ArrayList構造函數的參數,否則通常不會編譯。一個例子是當它KEY是一個整數。傳遞構造函數方法引用實際上會調用new ArrayList(KEY)…這顯然不是你想要的。

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