偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

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

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

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

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

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

 由于這段代碼包含了3 個潛在的浪費時間的操作(containsKey()、get()、put()),所以效率不會很高。每次執(zhí)行統(tǒng)計操作,都會搜索 Map 中的鍵?,F(xiàn)在,我們以此為例子,看如何為 Map 值增加提高性能。

Integer VS MutableInteger VS AtomicInteger

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

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

  1. public class MutableInteger {  
  2.  
  3.   private int val;  
  4.  
  5.   public MutableInteger(int val) {  
  6.     this.val = val;  
  7.   }  
  8.  
  9.   public int get() {  
  10.     return val;  
  11.   }  
  12.  
  13.   public void set(int val) {  
  14.     this.val = val;  
  15.   }  

另外一種方法也許就是使用Java中AtomicInteger了,它被用于諸如需要原子增長計數(shù)器的應用程序之中。而把AtomicInteger作為***是因為你會想要在對整數(shù)進行操作的時候?qū)崿F(xiàn)線程安全。因此它不能作為Integer的替代?;诖?,如果線程安全并不是你的項目一個重要的考慮事項,那我就不會推薦AtomicInteger。

 只一次搜索鍵

在使用MutableInteger之后,我們改變上面的代碼如下:

  1. if (map.containsKey(string)) {  
  2.   MutableInteger count = map.get(string);  
  3.   count.set(count.get() + 1);  
  4. else {  
  5.   map.put(string, new MutableInteger(1));  
  6. }  

或者

  1. MutableInteger count = map.get(string);  
  2. if (count != null) {  
  3.   count.set(count.get() + 1);  
  4. else {  
  5.   map.put(string, new MutableInteger(1));  
  6. }  

在最糟糕的時候,當鍵還沒有出現(xiàn)過,這段代碼會執(zhí)行2個搜索:一次是獲取MutableInteger,另一次是是設值。這比前面的那段代碼更優(yōu)化。但我們不應該僅僅滿足現(xiàn)在,如果你查看了[Map.putt()]方法。(http://docs.oracle.com/javase/7/docs/api/java/util/Map.html#put(K, V)) 在java文檔中的方法。你會發(fā)現(xiàn)這個方法會返回先前與之關聯(lián)鍵的值。這就意味著我們可以合并重新獲取對象和設置方法。然而,也許你會好奇:如果我們不首先獲得計數(shù)器,我們怎么來設置新的計數(shù)器呢?現(xiàn)在我們終于碰到了這篇文章中最棘手的部分:我們可以簡單的使用零頻率計數(shù)器!

  1. public int incrementCount(K key, int count) {  
  2.     MutableInteger tmpCount = new MutableInteger(0);  
  3.     MutableInteger oldCount = map.put(key, tmpCount);  
  4.     if (oldCount != null) {  
  5.       count += oldCount.get();  
  6.     }  
  7.     tmpCount.set(count);  
  8.     return count;  
  9.   }  

把所有必要操作放入到類中看起來對以后的使用非常有用。因此我創(chuàng)建了一個Counter類, 并聲明它為公共可用。在這個Counter中定義了一個集合,用于記錄一個對象在集合中出現(xiàn)的次數(shù)。假如你有一個包含集合{a, a, b, c}的計數(shù)器。調(diào)用getCount()方法,那么“a”將會返回2,然而調(diào)用keySet()將會返回{a,b,c}。這個類和Map的工作原理很像,但是它卻比Map有更簡單的方法。

獲得/設置/遞增計數(shù)對象并計算各種函數(shù)的計數(shù)。Counter的構造器和addAll()方法可用來復制另一個計數(shù)器的內(nèi)容??梢酝ㄟ^ IntCounter和 AbstractMapBag對Counter類進行修改。

Counter中一些被強調(diào)的操作方法如下:

  • incrementCount()和 decrementCount():根據(jù)給定的鍵值對當前的計數(shù)增加/減去給定的數(shù)值。如果這個鍵值在以前沒有出現(xiàn)過,那么可以斷定它的計數(shù)是0,增加計數(shù)的方法將會設置它的計數(shù)到給定的值。減值的方法將會把它的值設置為-1。
  • getCount():返回給定鍵值當前的計數(shù),如果以前沒有出現(xiàn)過就返回0。
  • keysAt(), keysAbove()keysBelow():返回給定鍵值的計數(shù),計數(shù)必須是與給定的閾值相等,大于或者小于。這個集合可能有0個元素,但是它不會為空。
  • argmin() 和 argmax():查找并返回在這個計數(shù)器中最小或者***計數(shù)的鍵值。如果有多個最小或者***計數(shù),那么就隨機返回一個值。當Counter為空的時候返回空值。

譯文鏈接:http://www.oschina.net/translate/most-efficient-way-to-increment-a-map-value-in-java-only-search-the-key-once

英文原文:Most efficient way to increment a Map value in Java — Only search the key once

責任編輯:林師授 來源: 開源中國編譯
相關推薦

2011-06-28 10:41:50

DBA

2012-12-28 11:32:11

打樁機AMD八核

2015-07-14 10:34:42

ViewModel代碼高效

2013-02-01 14:58:44

Android開發(fā)退出程序

2021-12-27 10:08:16

Python編程語言

2020-10-24 13:50:59

Python編程語言

2010-09-13 10:43:22

SQL Server

2012-08-28 09:21:59

Ajax查錯經(jīng)歷Web

2021-11-01 17:29:02

Windows系統(tǒng)Fork

2011-04-07 11:20:21

SQLServer

2019-03-29 08:21:51

馬蜂窩Golang并發(fā)代理

2021-08-27 07:47:06

引用類型

2018-01-10 17:06:36

Python線性回歸數(shù)據(jù)

2023-10-17 15:57:52

2009-03-25 18:26:20

多核服務器顯卡

2017-08-24 17:37:18

DNS緩存分析

2009-02-06 09:50:00

DHCP地址分配

2021-12-06 19:29:17

LRU內(nèi)存算法

2015-07-17 10:04:33

MKMapView優(yōu)化

2022-03-23 15:43:26

Android客戶端架構
點贊
收藏

51CTO技術棧公眾號