Usando HashMap – como ocorre o armazenamento e a recuperação

 
 

Abaixo será demonstrado como um objeto é armazenado e depois retornado de uma HashMap. Poderemos notar que o HashMap solicita ao objeto o valor de seu hashCode() para armazená-lo no ‘balde’ correto.

 
 

import java.util.*;

 
 

public class Teste {

public static void main(String[] args){

Map<MyKey,String> m = new HashMap<MyKey,String>();

MyKey k1 = new MyKey(“bozo”);

MyKey k2 = new MyKey(“bozo”);

MyKey k3 = new MyKey(“casa”);

 
 

m.put(k1,”bozo”);

 
 

System.out.println(“k1=” + k1 + ” resultado ” + m.get(k1)); // # 1

System.out.println(“k2=” + k2 + ” resultado ” + m.get(k2)); // # 2

System.out.println(“k3=” + k3 + ” resultado ” + m.get(k3)); // # 3

 
 

// quando mudamos o valor de k1 estamos automaticamente também o modificando na key do HashMap. Como na propriedade da classe MyKey.hashMap() foi definido que o hash será o ‘length’ da key, como “vent”.length = “bozo”.length então esta chave fica armazenada no mesmo “balde” dentro das coleções de chava HashMap.

k1.setKey(“vent”);

System.out.println(“k1=” + k1 + ” resultado ” + m.get(k1)); // # 4

 
 

// como o hashcode direciona para um determinado “balde” o item não é achado.

k1.setKey(“predio”);

System.out.println(“k1=” + k1 + ” resultado ” + m.get(k1)); // # 5

}

}

 
 

Output (simplificado):

k1=bozo resultado bozo // # 1

k2=bozo resultado bozo // # 2

k3=casa resultado null
// # 3

k1=vent resultado bozo // # 4

k1=predio resultado null
// # 5

 
 

Output completo:

Executou MyKey.hashCode()=4 para key= bozo

// referente a linha ‘ m.put(k1,”bozo”);’. Verificação em que ‘balde’ irá ser colocado o primeiro objeto

 
 

Executou MyKey.hashCode()=4 para key= bozo // verificação m.get(k1)

k1=bozo resultado bozo

 
 

Executou MyKey.hashCode()=4 para key= bozo // verificação m.get(k2)

Executou MyKey.equals() this.Key=>>bozo<< o.key (parametro)=>>bozo<<

k2=bozo resultado bozo

// o equals só ocorre quando a variável no caso ‘k2’ ou ‘k3’ é diferente da que se encontra na HashMap key.

 
 

 
 

Executou MyKey.hashCode()=4 para key= casa // verificação m.get(k3)

Executou MyKey.equals() this.Key=>>casa<< o.key (parametro)=>>bozo<<

k3=casa resultado null

// neste caso, apesar do hashCode() = 4, como a referência é diferente ‘k3’ o equals executa e retorna false, por isso o resultado é nulo.

 
 

Executou MyKey.hashCode()=4 para key= vent // verificação m.get(k1)

k1=vent resultado bozo

// neste caso, como alteramos o próprio valor da variável ‘k1’ (variável da qual é chave da hashMap e possuimos a referência externa a hashMap) o método equals não executa. Como hashCode() = 4 mesmo depois de alterado, o resultado pode ser achado no ‘balde’.

 
 

Executou MyKey.hashCode()=6 para key= predio // verificação m.get(k1)

k1=predio resultado null

 
 

 
 

 
 

class MyKey {

private String key;

public MyKey(String key){

this.key = key;

}

 
 

public void setKey(String key){

this.key = key;

}

 
 

public boolean equals(Object o){

// só é usado quando os objetos são diferentes

System.out.println(“\tExecutou MyKey.equals() this.Key=>>” + this.key + “<< o.key (parametro)=>>” + ((MyKey)o).key + “<<“);

 
 

if (o instanceof MyKey && ((MyKey)o).key == this.key) return true;

return false;

}

 
 

public int hashCode(){

// só é usado quando os objetos são diferentes. Vide acima ‘k1’ e ‘k2’ ou ‘k3’ veja que são referências diferentes

System.out.println(“\tExecutou MyKey.hashCode()=” + key.length() + ” para key= ” + key);

return key.length();

}

 
 

public String toString(){

return key;

}

}

Esta entrada foi publicada em Arrays & Colletions com as etiquetas . ligação permanente.

Deixe uma Resposta

Preencha os seus detalhes abaixo ou clique num ícone para iniciar sessão:

Logótipo da WordPress.com

Está a comentar usando a sua conta WordPress.com Terminar Sessão / Alterar )

Imagem do Twitter

Está a comentar usando a sua conta Twitter Terminar Sessão / Alterar )

Facebook photo

Está a comentar usando a sua conta Facebook Terminar Sessão / Alterar )

Google+ photo

Está a comentar usando a sua conta Google+ Terminar Sessão / Alterar )

Connecting to %s