2010-10-14 14 views
5

Qualcuno mi ha detto che le hashmap sono piuttosto lente. Quindi mi sto solo chiedendo se usare l'hashmap o una logica caso-interruttore.Perché usare una hashmap?

Il mio requisito è questo. Ho un set di CountryNames e CountryCodes. My ListView mostra i nomi dei paesi. Quando si fa clic su un nome di un paese, devo Toast the CountryCode.

In uno scenario del genere, dovrei mantenere un HashMap di CountryNames e codici e accedere a questo per ottenere il codice corrispondente ?:

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

O è meglio scrivere un caso interruttore in questo modo

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

//etc 
} 

Quale è più veloce? Se non Hashmaps, allora in quali scenari pratici sarebbe utilizzata una mappa?

-Kiki

+3

Questa domanda non sembra essere specifica per Android. – Brian

risposta

14

Per due valori, un interruttore sarà più veloce. Un'hammap controllerà sempre l'uguaglianza della tua chiave, quindi non può battere uno o due test .equals().
Per molti valori, un hash sarà più veloce. Un interruttore deve testare ogni valore finché non trova quello giusto.

Per un numero limitato di valori (ad esempio fino a 10 o giù di lì), preferire un interruttore. Sarà più leggero e veloce.
Per un numero elevato di valori (in aumento di 50), è preferibile un hash. Un hash non dovrà controllare tutti i valori, quindi sarà più veloce di un interruttore quando il numero di valori aumenta. Per valori di 10 ~ 50, ti suggerisco di fare quello che ritieni più leggibile perché la performance sarà simile.

Ora, se stai cercando prestazioni estreme su stringhe statiche conosciute in fase di compilazione, puoi esaminare strumenti di generazione del codice come gnuperf.
Se non conosci le tue stringhe al momento della compilazione ma sai che saranno decentemente di lunghezza breve e abbastanza uniforme, o con prefissi comuni, probabilmente sarai il più veloce con una struttura dati Trie.
Se si desidera mantenere le prestazioni su un numero elevato di stringhe molto eterogenee o su oggetti che potrebbero non essere stringhe, HashMap è la strada da seguire. È praticamente imbattibile quando il numero di oggetti è molto alto (in miliardi o più).

+0

Si noti che in questo caso particolare, si potrebbe voler utilizzare qualcosa come SparseArray di Android per evitare l'autoboxing/unboxing. –