L’ordine dei valori recupera da una HashMap l’ordine di inserimento

Sto cercando di capire l’ordine in cui i valori in una HashMap sono / possono essere recuperati. Ecco lo snippet di codice per lo stesso.

import java.util.HashMap; public class HashMapExample { public static void main(String[] args) { HashMap hashmap = new HashMap(); hashmap.put(1, "apple" ); hashmap.put(2, "lemon" ); hashmap.put(3, "orange" ); hashmap.put(4, "banana" ); hashmap.put(5, "litchi" ); hashmap.put(6, "mango" ); hashmap.put(7, "papaya" ); System.out.println(hashmap.size()); for (String key : hashmap.values()) { System.out.println(key); } } } 

produzione:

 7 apple lemon orange banana litchi mango papaya 

I valori sono stampati nell’ordine in cui sono stati inseriti. È vero in generale? Mi aspettavo che i valori fossero stampati in un ordine arbitrario. Questo sta usando Java 6.

I valori sono stampati nell’ordine in cui sono stati inseriti. È vero in generale? Mi aspettavo che i valori fossero stampati in ordine casuale.

L’API HashMap non definisce l’ordine di iterazione.

Tuttavia, se si considera l’implementazione di HashMap, è ansible dedurre che esiste una relazione transitoria complessa tra l’ordine di iterazione, i valori hash delle chiavi, l’ordine in cui sono state inserite le chiavi e la dimensione della tabella hash. Questa relazione viene criptata se la tabella si ridimensiona.

Nel tuo caso, stai usando le chiavi Integer che significa che i valori hash delle chiavi sono i valori chiave stessi. Inoltre, hai inserito le voci nell’ordine delle chiavi. Ciò conduce (fortuitamente!) All’ordine di iterazione che corrisponde all’ordine di inserimento. Ma se continuassi a inserire più chiavi, scopriresti che l’ordine di ripetizione “avvolge”. Quindi mentre il tavolo passa attraverso una serie di ridimensionamenti, l’ordine diventerà progressivamente sempre più criptato.

In breve, ciò che stai vedendo è un artefatto dell’implementazione di hashtable e non qualcosa che puoi (o dovrebbe) usare sensibilmente. Non ultimo perché potrebbe cambiare da una versione di Java alla successiva.

Dalla class Javadoc: HashMap “non garantisce l’ordine della mappa, in particolare, non garantisce che l’ordine rimarrà costante nel tempo”.

Se è necessario un ordinamento coerente, è ansible utilizzare LinkedHashMap (per l’ordine di inserimento / accesso) o TreeMap (per l’ordine di confronto). Si noti che questi mantengono l’ordine delle chiavi, non i valori.

Una LinkedHashMap è ciò che stai cercando . Dalla doco, differisce da HashMap in quanto mantiene una lista doppiamente collegata che attraversa tutte le sue voci

Prova LinkedHashMap se l’ordine è importante … vedi da JavaDoc

public class LinkedHashMap estende HashMap

Implementazione della tabella hash e dell’elenco link dell’interfaccia Map, con un ordine di iterazione prevedibile. Questa implementazione differisce da HashMap in quanto mantiene una lista doppiamente collegata che attraversa 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 inserimento). Si noti che l’ordine di inserimento non è influenzato se una chiave viene reinserita nella mappa. (Una chiave k viene reinserita in una mappa m se m.put (k, v) viene invocato quando m.containsKey (k) restituisce true immediatamente prima dell’invocazione.)

Una raccolta correlata è ConcurrentSkipListMap di java.util.concurrent. Un skiplist ti permette di attraversare le voci in ordine di chiave e anche di guardarle in ordine casuale (ma non veloce come una HashMap).

C’è una bella applet demo skiplist.