歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> Map 值增加的最高效的方法 —— 只一次搜索鍵

Map 值增加的最高效的方法 —— 只一次搜索鍵

日期:2017/3/1 9:51:58   编辑:Linux編程

這個問題初看起來可能會比較基礎,但卻在論壇裡頻繁地討論。在這篇文章中,我將會討論一種只在 Map 中搜索一次鍵的方法。

讓我們看一個例子。假設我正在創建一個詞頻表,使用 Map 來保存,每一個鍵都是一個待統計的詞而值則是其頻率(每次添加詞的時候都遞增)。一個直接的實現方法是:

int count = map.containsKey(string) ? map.get(string) : 0;
map.put(string, count + 1);

由於這段代碼包含了3 個潛在的浪費時間的操作(containsKey()、get()、[put()](http://docs.Oracle.com/javase/7/docs/api/java/util/Map.html#put(K, V))),所以效率不會很高。每次執行統計操作,都會搜索 Map 中的鍵。現在,我們以此為例子,看如何為 Map 值增加提高性能。

Integer VS MutableInteger VS AtomicInteger

我們不得不調用三次消耗性能的操作,一個重要的原因就是使用了Integer來計數。在Java中,Integer是不可以被改變的。它在構造完成以後就會阻止我們修改其整數值。因而,為了讓計數器增長,我們就不得不從map中先獲得整數,然後再創建另外一個新的整數,新增並且添加回map中

需要使得計數器可修改,有幾種方法。其中一個就是簡單的創建你自己的MutableInteger,想我在下面展示的這樣:

public class MutableInteger {

private int val;

public MutableInteger(int val) {
this.val = val;
}

public int get() {
return val;
}

public void set(int val) {
this.val = val;
}
}

另外一種方法也許就是使用Java中AtomicInteger了,它被用於諸如需要原子增長計數器的應用程序之中。而把AtomicInteger作為首選是因為你會想要在對整數進行操作的時候實現線程安全。因此它不能作為Integer的替代。基於此,如果線程安全並不是你的項目一個重要的考慮事項,那我就不會推薦AtomicInteger。

更多詳情見請繼續閱讀下一頁的精彩內容: http://www.linuxidc.com/Linux/2013-10/91697p2.htm

Copyright © Linux教程網 All Rights Reserved