2010-10-14 90 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