2015-07-29 30 views
5

Come ho capito, LinkedHashMap estende HashMap e LinkedHashMap.Entry estende anche HashMap.Entry.Informazioni su acessOrder LinkedHashMap Implementazione in java

LinkedHashMap ha due attributi principali 1) intestazione che è un LinkedHashMap.Entry nodo. e 2) ereditato tabella che è HashMap.Entry [] array. Ora la tavolo matrice in LinkedHashMap è assegnato di LinkedHashMap.Entry in fase di esecuzione e questo è curato da sotto metodo:

/** 
    * This override differs from addEntry in that it doesn't resize the 
    * table or remove the eldest entry. 
    */ 
    void createEntry(int hash, K key, V value, int bucketIndex) { 
     HashMap.Entry<K,V> old = table[bucketIndex]; 
     Entry<K,V> e = new Entry<>(hash, key, value, old); 
     table[bucketIndex] = e; 
     e.addBefore(header); 
     size++; 
    } 

prime tre righe del metodo effettivamente converte HashMap .Entry a LinkedHashMap.Entry e mantiene anche i riferimenti di dopo e prima della voce in un modo tale che prima di intestazione sta puntando all'ultimo elemento in ordine e di ultimo elemento dopo sta indicando intestazione cerchio di formazione.

Ora, quando si crea un esempio di una delle mappe (utilizzando nuovo costruttore), nessuna memoria viene allocata per attributo tabella come appena inizializzato al tavolo vuoto.

Map<String, String> linkedHashMap = new LinkedHashMap<String, String>(); 

Ora consente di dire che facciamo i nostri mette: -

linkedHashMap.put("a", "A"); 
linkedHashMap.put("b", "B"); 
linkedHashMap.put("c", "C"); 

Dopo queste dichiarazioni la nostra struttura dati LinkedHashMap (tavolo array è inizializzato dopo la prima messa) sarebbe simile nella foto . Ho contrassegnato gli elementi a, b e c per una facile consultazione. Capisco che l'ordine reale non sarebbe lo stesso. Trovo che questa struttura di dati sia piuttosto complessa, così tanti riferimenti. Ha una doppia lista collegata mantenuta in modo molto diverso e per scopi diversi e anche una singola lista collegata per la normale hashmap e anche quella nella stessa voce. La mia comprensione è corretta?

enter image description here

risposta

0

che hai fatto qualcosa di buono a scavare nel codice che è grande! Comunque LinkedHashMap non è così complesso come tu vuoi che sia. In realtà è un'estensione molto semplice di HashMap con l'unico scopo di preservare l'ordine di cui sono stati aggiunti gli elementi †.

Le prime tre righe del metodo in realtà converte HashMap.Entry a LinkedHashMap.Entry e anche mantiene i riferimenti di prima e dopo della voce

questo è corretto, LinkedHashMap. L'articolo estende HashMap.Entry ma aggiunge il collegato bit memorizzando i puntatori alle voci before e after.

HashMap

enter image description here

LinkedHashMap

enter image description here

Anche se il LinkedHashMap schema sembra molto più complesso, è semplicemente aggiungendo la before e after puntatori rappresentate dal Blu/Frecce rosse.

LinkedHashMap supporta anche l'ordine di accesso (modalità ordine) a parte l'ordine di inserimento come argomento costruttore. Se flag è impostato su true, l'iterazione sull'elenco restituirà gli elementi nell'ordine in cui sono stati utilizzati anziché l'ordine in cui sono stati inseriti.

Immagini da JavaArticles.

+0

Grazie per il collegamento JavaArticles. Testimonia (anche se ad alto livello) ciò che ho fatto di ispezione del codice. E sì, non voglio che la struttura dei dati sia complessa. L'ho trovato complesso all'inizio :) e credo di non essere solo in questo. – nanosoft