2010-10-14 82 views
5

有人告訴我,hashmaps比較慢。所以我只是想知道是否使用hashmap或switch case邏輯。爲什麼要使用散列表?

我的要求是這樣的。我有一組CountryNames和CountryCodes。我的ListView顯示國家的名稱。當點擊國家名稱項目時,我必須爲CountryCode敬酒。

在這種情況下,我應該保持CountryNames和代碼的HashMap和訪問該得到相應的代碼?:

myMap.put("US", 355); 
myMap.put("UK", 459); 
//etc 

或者是更好地寫出了開關的情況下,像這樣

switch (vCountryNamePos): 
{ 
case 0: //US 
vCountryCode = 355; 
break; 
case 1: //UK 
vCountryCode = 459; 
break; 

//etc 
} 

哪個更快?如果不是HashMap,那麼在一個實際的情況下Map會被使用?

-Kiki

+3

這個問題看起來不是Android的專用。 – Brian 2010-10-14 05:17:53

回答

14

對於兩個值,開關會更快。哈希映射至少會檢查您的密鑰是否相等,因此無法擊敗一個或兩個.equals()測試。
對於許多值,哈希將更快。交換機必須測試每個值直到找到合適的值。

對於少數值(比如說高達10左右),更喜歡一個開關。它會更輕,更快。
對於大數值(超過50),更喜歡散列。哈希將不必檢查所有值,因此當值的數量增加時,它將比開關更快。 對於10〜50的值,我建議你做你認爲更可讀的東西,因爲表現會相似。

現在,如果您正在研究編譯時已知的靜態字符串的極限性能,您可以查看代碼生成工具,如gnuperf。
如果你在編譯時不知道你的字符串,但是你知道它們會長得短而且體型統一,或者有共同的前綴,你可能會用Trie的數據結構最快。
如果您想要保持大量非常不同類型的字符串或可能不是字符串的對象的性能,那麼HashMap就是最好的選擇。當物體的數量非常高時(數十億甚至更多),它幾乎是無與倫比的。

+0

請注意,在這種特殊情況下,您可能想要使用類似Android SparseArray的東西來避免自動裝箱/拆箱。 – 2010-10-14 05:46:24

相關問題