为什么要使用哈希表?

7
有人告诉我哈希表相对较慢。所以我在想是使用哈希表还是 switch case 逻辑。
我的需求是这样的。我有一组 CountryNames 和 CountryCodes。我的 ListView 显示国家的名称。当点击一个国家名称项时,我必须 Toast 出该国家的 CountryCode。
在这种情况下,我应该维护一个 CountryNames 和 Codes 的 HashMap,并访问它来获取相应的 Code 吗?
myMap.put("US", 355);
myMap.put("UK", 459);
//etc

还是像这样编写switch case语句更好:
switch (vCountryNamePos):
{
case 0:   //US
vCountryCode = 355;
break;
case 1:   //UK
vCountryCode = 459;
break;

//etc
}

哪个更快?如果不是哈希映射,那么在什么实际场景下将使用Map?

-Kiki


3
这个问题似乎与Android无关。 - Brian
1个回答

15

对于只有两个值的情况,使用switch语句会更快。哈希表总是要检查键的相等性,因此无法打败一到两个.equals()测试。
对于许多值的情况,哈希表会更快。Switch语句必须测试每个值,直到找到正确的值。

对于少量的值(比如10个或更少),建议使用switch语句。它会更轻盈和更快速。
对于大量的值(超过50个),建议使用哈希表。哈希表不必检查所有值,因此当值的数量增加时,它会比开关更快。 如果值的数量在10~50之间,我建议你选择更易读的代码,因为性能差别不大。

现在,如果您正在寻求在编译时已知的静态字符串的极端性能,您可以考虑像gnuperf这样的代码生成工具。
如果您不知道编译时的字符串,但知道它们会相当短并且长度相当均匀,或者具有常见前缀,则使用Trie数据结构可能是最快的选择。
如果您想在大量非常异构的字符串或可能不是字符串的对象上保持高性能,则HashMap是最好的选择。当对象数量非常高(十亿级别或更高)时,它几乎是无敌的。


请注意,在这种特殊情况下,您可能希望使用类似于Android的SparseArray来避免自动装箱/拆箱。 - Romain Guy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接