2009-07-27 13 views
56

Sto utilizzando una LinkedHashMap per garantire l'ordine quando qualcuno tenta di accedervi. Tuttavia, quando arriva il momento di iterare su di esso, usa entrySet() per restituire le coppie chiave/valore anche per garantire l'ordine? Non verranno apportate modifiche durante l'iterazione.Anche EntrySet() in LinkedHashMap garantisce l'ordine?

EDIT: Inoltre, ci sono degli effetti negativi dall'iterazione attraverso la mappa iterando attraverso le sue chiavi e chiamando get?

+0

Stavo per fare la stessa domanda, ma perché chiederlo se qualcun altro ha già chiesto e ricevuto una buona risposta? +1 per una buona domanda. – uTubeFan

+0

In LinkedHashMap è possibile utilizzare ordine di inserimento e ordine di accesso. L'ordine viene mantenuto sempre. Si prega di coprire il mio [Vita interna di LinkedHashMap] (http://volodial.blogspot.com/2013/07/internal-life-of-linkedhashmap-in-java.html) tutorial –

+0

Possibile duplicato di [È l'ordine garantito per il ritorno di chiavi e valori da un oggetto LinkedHashMap?] (http://stackoverflow.com/questions/2923856/is-the-order-guaranteed-for-the-return-of-keys-and-values-from-a- linkedhashmap-o) – Roland

risposta

43

Secondo la Javadocs, sì .

Questa implementazione differisce da HashMap in quanto mantiene una lista doppiamente collegata che passa attraverso tutte le sue voci. Questo elenco collegato definisce l'ordine di iterazione, che è normalmente l'ordine in cui le chiavi sono state inserite nella mappa (ordine di inserzione).

Per quanto riguarda la modifica, no, dovrebbe funzionare bene. Ma il set di voci è leggermente più veloce poiché evita il sovraccarico di cercare ogni chiave nella mappa durante l'iterazione.

+11

ma entrySet restituisce un Set che non è ordinato da solo? –

+3

Sì, tecnicamente il parametro entrySet non ha modo di accedere a una posizione, ma entrySet.iterator(). L'iteratore ci consente di avere una lista ordinata. – Jpatrick

+2

Mi piacerebbe sapere che questa risposta è corretta, ma come Jonathan ha sottolineato, 'entrySet()' restituisce un Set. Jpatrick dice che l'iteratore del set ci consente di avere una lista ordinata, ma http://docs.oracle.com/javase/6/docs/api/java/util/Set.html#iterator() dice "Gli elementi vengono restituiti in no ordine particolare (a meno che questo insieme non sia un'istanza di qualche classe che fornisce una garanzia). " E nessuno dei documenti a cui si fa riferimento qui dice che entrySet() restituisce un Set che è un'istanza di una classe che garantisce l'ordine. Mi sto perdendo qualcosa? – LarsH

1

Questo elenco collegato definisce l'ordine di iterazione, che è normalmente l'ordine in cui le chiavi sono state inserite nella mappa (ordine di inserimento). Si noti che l'ordine di inserimento non è influenzato se una chiave viene reinserita nella mappa. (A k chiave viene reinserito una mappa m se m.put (k, v) viene richiamato quando m.containsKey (k) restituirebbe true immediatamente prima della chiamata.)

1

Se si è certi che non verranno apportate modifiche durante l'iterazione, è garantito l'ordine corretto con entrySet(), come indicato nello API.

+1

I documenti API a cui ci si è collegati per' entrySet() 'non dicono nulla su come garantire un corretto ordinamento. L'unica dichiarazione correlata su quella pagina è "Questa classe [vale a direHashMap] non fornisce garanzie sull'ordine della mappa; in particolare, non garantisce che l'ordine rimanga costante nel tempo. "A cosa ti riferivi con quel link? – LarsH

Problemi correlati