L'idea generale alla base di un set o di un dizionario è che si prevede di eseguire molte operazioni di ricerca. È ottimizzato per le suddette operazioni di ricerca utilizzando un hash che consente la ricerca O (1) nella maggior parte dei casi.
L'ordine viene eseguito utilizzando matrici o elenchi concatenati e, in effetti, eseguendo operazioni in cui l'ordine è importante, sono ottimizzati per che come l'aggiunta di un valore alla fine o all'inizio.
Per la natura di queste due strutture dati, nessuno dei due è ottimizzato per entrambi. Questo non vuol dire che non sia possibile, ma coinvolge entrambe le strutture dati se si desidera ottimizzare sia la ricerca che le operazioni basate sugli ordini.
Quindi hai questo compromesso tra:
ottimizzazione dell'operazione di ricerca < = > operazioni basate sugli ordini < = > utilizzo della memoria
Il consenso generale è che come programmatore, in generale, si desidera ottimizzare l'uno o l'altro, ma non entrambi, e certamente nessuno si difende raddoppiando l'utilizzo della memoria quando è solo necessario ottimizzare uno dei due.
Detto questo, ci sono sono implementazioni con entrambi, o almeno in Java, in particolare LinkedHashMap
è sia un array che un dizionario basato su hash. A volte potresti aver bisogno di entrambi, ma è consigliabile utilizzare ArrayList
se hai bisogno solo di un elenco e di un HashMap
se hai solo bisogno di un dizionario.