2010-10-14 11 views
5

Quelqu'un m'a dit que les hashmaps sont plutôt lents. Donc, je me demande simplement si vous devez utiliser hashmap ou une logique de casse.Pourquoi utiliser un hashmap?

Mon exigence est la suivante. J'ai un ensemble de CountryNames et CountryCodes. My ListView affiche les noms des pays. Quand un élément de nom de pays est cliqué, je dois Toast the CountryCode.

Dans un tel scénario, dois-je maintenir un HashMap de CountryNames et des codes et accéder à ce pour obtenir le code correspondant ?:

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

Ou est-il préférable d'écrire un boîtier de commutation comme si

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

//etc 
} 

Lequel est le plus rapide? Si ce n'est pas Hashmaps, alors dans quels scénarios pratiques une carte serait-elle utilisée?

-Kiki

+3

Cette question ne semble pas être spécifique aux androïdes. – Brian

Répondre

14

Pour deux valeurs, un commutateur sera plus rapide. Un hashmap vérifie toujours au moins l'égalité de votre clé, donc il ne peut pas battre un ou deux tests .equals().
Pour de nombreuses valeurs, un hachage sera plus rapide. Un commutateur doit tester chaque valeur jusqu'à ce qu'il trouve la bonne.

Pour un petit nombre de valeurs (disons jusqu'à 10), préférez un commutateur. Ça va être plus léger et plus rapide.
Pour un grand nombre de valeurs (supérieures à 50), préférez un hachage. Un hachage n'aura pas à vérifier toutes les valeurs, il sera donc plus rapide qu'un commutateur lorsque le nombre de valeurs augmente. Pour des valeurs de 10 ~ 50, je vous suggère de faire ce que vous jugez plus lisible parce que la performance sera similaire. Maintenant, si vous recherchez des performances extrêmes sur les chaînes statiques connues au moment de la compilation, vous pouvez vous intéresser aux outils générateurs de code comme gnuperf.
Si vous ne connaissez pas vos chaînes au moment de la compilation, mais vous savez qu'elles seront décemment courtes et d'une longueur décemment uniforme, ou avec des préfixes communs, vous allez probablement être plus rapide avec une structure de données Trie.
Si vous souhaitez conserver des performances sur un grand nombre de chaînes très hétérogènes ou sur des objets qui ne sont peut-être pas des chaînes, alors HashMap est le chemin à parcourir. C'est presque imbattable lorsque le nombre d'objets est très élevé (dans les milliards ou plus).

+0

Notez que dans ce cas particulier, vous pouvez utiliser quelque chose comme SparseArray d'Android pour éviter l'autoboxing/unboxing. –

Questions connexes