Java linkedhashmap vs hashmap

O princípio por trás disso é descrito aqui.

LinkedHashMap (Java Platform SE 7 b99)

Se você vir a implementação interna do HashMap e LinkedHashMap.

O bucket do HashMap é implementado por meio da matriz, enquanto o Linkedlist é usado para o LinkedHashMap. E como você sabe, o Linkedlist garante a ordem de inserção e, por isso, o LinkedHashMap também mantém a ordem de inserção do elemento.

Se você quiser saber como a inserção e a recuperação de dados acontecem aqui, é o mesmo que funciona com o HashMap. Para detalhes do HashMap, você pode acessar o link abaixo

http://javarevisited.blogspot.in/2011/02/how-hashmap-works-in-java.html

Veja o código fonte:

LinkedHashMap - java.util.LinkedHashMap (.java) - Origem da classe GrepCode

As primeiras linhas aqui já são bastante esclarecedoras:

147 classe pública LinkedHashMap 148 estende o HashMap 149 implementos Mapa

Um LinkedHashMap estende o HashMap. Além da lógica no HashMap, ele mantém uma lista vinculada de todas as entradas. Como qualquer implementação de lista vinculada, essa é apenas uma estrutura de dados com elementos 'Entry', onde cada entrada mantém uma referência às entradas seguintes e anteriores na lista:

Classe estática 316 privada estende HashMap.Entry {317 // Esses campos compreendem a lista duplamente vinculada usada para iteração.318 Entrada antes Depois; .....360}

E o próprio LinkedHashMap mantém uma referência ao cabeçalho da lista:

157 entrada transitória privada cabeçalho;

Agora, por exemplo, o método 'put' no LinkedHashMap apenas estende o método put do HashMap adicionando também uma nova entrada ao linkedList. Isso é feito substituindo o método 'addEntry', chamado de 'put', que permanece definido no HashMap. Esta é a definição de 'put':

386 público V put (chave K, valor V) {387 se (chave == nulo)388 return putForNullKey (value);389 int hash = hash (key.hashCode ());390 int i = indexFor (hash, comprimento de tabela);391 para (Entrada e = tabela [i]; e! = nulo; e = e.next) {392 Objeto k;393 if (e.hash == hash && ((k = e.key) == chave || key.equals (k))) {394 V oldValue = valor e;395 e.value = valor;396 e.recordAccess (this);397 return oldValue;398}399}400 401 modCount ++;402 addEntry (hash, chave, valor, i);403 retorno nulo;404}

Observe a chamada para 'addEntry' lá. Esta é a definição de 'addEntry' do LinkedHashMap:

422 void addEntry (hash int, chave K, valor V, int bucketIndex) {423 createEntry (hash, chave, valor, bucketIndex); ....433}

Após 'createEntry', ele realmente cria um objeto Entry e, em seguida, chama o método 'addBefore' que o adiciona à lista vinculada:

335 private void addBefore (Entrada existingEntry) {336 depois = currentEntry;337 before = existingEntry.before;338 before.after = this;339 after.before = this;340}

Se você tinha uma classe de estruturas de dados, também escreveu código assim :)