2011-11-02 10 views
57

Qual è il motivo per cui non è sempre possibile utilizzare una HashMap, anche se è molto più efficiente di ArrayList o LinkedList in add, rimuove le operazioni, anche indipendentemente dal numero di gli elementi.Quando utilizzare HashMap su LinkedList o ArrayList e viceversa

L'ho cercato su google e ho trovato alcuni motivi, ma c'era sempre una soluzione per l'utilizzo di HashMap, con vantaggi ancora vivi.

+11

'' Lists' e Maps' sono due * completamente * strutture di dati diversi, con diverse operazioni e invarianti. Puoi spiegare il contesto/i requisiti a cui stai pensando dove entrambe sarebbero soluzioni accettabili? –

+3

A quanto pare non hai mai avuto bisogno di tenere un set di cose * in un particolare ordine * ... –

+39

Downvote, perché? Penso che questa sia una domanda corretta. Mostra la mancanza di knowlegde, ma su SO domanda non dovrebbe essere downvoted per mostrare la mancanza di conoscenza. In realtà una domanda è sempre il risultato della mancanza di conoscenza. –

risposta

78

Le liste rappresentano un ordinamento sequenziale di elementi. Le mappe sono utilizzate per rappresentare una raccolta di coppie chiave/valore.

Mentre è possibile utilizzare una mappa come elenco, ci sono alcuni aspetti negativi di farlo.

Ordine di manutenzione: - Viene ordinato un elenco per definizione. Aggiungete elementi e quindi potrete ripetere l'iterazione attraverso l'elenco nell'ordine in cui sono stati inseriti gli articoli. Quando aggiungi elementi ad una HashMap, non ti è garantito di recuperare gli oggetti nello stesso ordine in cui li hai inseriti. Ci sono sottoclassi di HashMap come LinkedHashMap che manterrà l'ordine, ma in generale l'ordine non è garantito con una mappa.

chiave/valore semantica: - Lo scopo di una mappa è quello di memorizzare gli elementi in base a una chiave che può essere utilizzato per recuperare l'oggetto in un momento successivo. Funzionalità simili possono essere raggiunte solo con un elenco nel caso limitato in cui la chiave è la posizione nell'elenco.

Leggibilità del codice Considerare i seguenti esempi.

// Adding to a List 
    list.add(myObject);   // adds to the end of the list 
    map.put(myKey, myObject); // sure, you can do this, but what is myKey? 
    map.put("1", myObject);  // you could use the position as a key but why? 

    // Iterating through the items 
    for (Object o : myList)   // nice and easy 
    for (Object o : myMap.values()) // more code and the order is not guaranteed 

funzionalità Collezione Alcune funzioni grande utilità sono disponibili per le liste tramite la classe Collezioni. Per esempio ...

// Randomize the list 
    Collections.shuffle(myList); 

    // Sort the list 
    Collections.sort(myList, myComparator); 

Spero che questo aiuti,

+0

Si dice spesso che le liste collegate siano cattive a causa di problemi di prestazioni.Uso spesso LinkedList su ArrayList a causa dell'ordine degli elementi. Sarebbe meglio (per prestazioni e memoria) se usassi HashMaps con posizioni come chiavi? – Seza

28

Gli elenchi e le mappe sono strutture di dati differenti. Le mappe vengono utilizzate per quando si desidera associare una chiave a un valore e Le liste sono una raccolta ordinata.

Mappa è un'interfaccia in Java Collection Framework e una HashMap è un'implementazione dell'interfaccia Mappa. HashMap è efficiente per individuare un valore basato su una chiave e inserire e cancellare valori basati su una chiave. Le voci di una HashMap non sono ordinate.

ArrayList e LinkedList sono un'implementazione dell'interfaccia List. LinkedList fornisce accesso sequenziale ed è generalmente più efficiente nell'inserimento e nella cancellazione di elementi nell'elenco, tuttavia è meno efficiente nell'accedere agli elementi di un elenco. ArrayList fornisce accesso casuale ed è più efficiente nell'accedere agli elementi, ma in genere è più lento nell'inserire ed eliminare elementi.

Problemi correlati