2010-10-14 45 views
5

Alguien me dijo que los hashmaps son bastante lentos. Entonces, me pregunto si debo usar hashmap o una lógica de switch case.¿Por qué usar un hashmap?

Mi requisito es esto. Tengo un conjunto de CountryNames y CountryCodes. My ListView muestra los nombres de los países. Cuando se hace clic en un elemento de nombre de país, debo Toast the CountryCode.

En tal escenario, debería mantener un HashMap de CountryNames y los códigos y acceder a este para obtener el código correspondiente ?:

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

O es mejor para escribir un caso así como el interruptor

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

//etc 
} 

¿Qué es más rápido? Si no son Hashmaps, ¿en qué escenarios prácticos se usaría un Mapa?

-Kiki

+3

Esta pregunta no parece ser específica de Android. – Brian

Respuesta

14

para dos valores, un interruptor será más rápido. Un hashmap siempre verificará, al menos, la igualdad de tu clave, por lo que no puede superar una o dos pruebas de .equals().
Para muchos valores, un hash será más rápido. Un interruptor tiene que probar cada valor hasta que encuentre el correcto.

Para una pequeña cantidad de valores (digamos hasta 10 o así), prefiera un interruptor. Va a ser más ligero y más rápido.
Para una gran cantidad de valores (en más de 50), prefiera un hash. Un hash no tendrá que verificar todos los valores, por lo que será más rápido que un interruptor cuando aumente el número de valores. Para valores de 10 ~ 50, te sugiero que hagas lo que sientas que es más legible porque el rendimiento será similar.

Ahora, si está buscando un rendimiento extremo en cadenas estáticas conocidas en tiempo de compilación, puede buscar herramientas generadoras de código como gnuperf.
Si no conoce sus cadenas en el momento de la compilación, pero sabe que serán decentemente cortas y decentemente uniformes en longitud, o con prefijos comunes, probablemente sea más rápido con una estructura de datos Trie.
Si desea mantener el rendimiento en un gran número de cadenas muy heterogéneas, o en objetos que pueden no ser cadenas, entonces HashMap es el camino a seguir. Es bastante inmejorable cuando la cantidad de objetos es muy alta (en miles de millones o más).

+0

Tenga en cuenta que en este caso particular, es posible que desee utilizar algo como SparseArray de Android para evitar el autoboxing/unboxing. –