Dúvida: para os HashSet’s e LinkedHashSets, quando o hashCode for diferente ele armazena dois itens que tenham o método equals retornando true?

 
 

Conforme regra de pesquisa:

     1º ache o ‘balde’ correto

2º ache o elemento correto dentro do balde

 
 

Podemos observar que quando os hashCodes dos objetos comparados são diferentes, o Set poderá armazenar objetos cujas suas comparações com os métodos equals retornem true em diferentes ‘baldes’, portanto a Set considerará dois itens distintos:

 
 

import java.util.*;

 
 

 
 

class Pessoa {

String nome;

public Pessoa(String nome){this.nome = nome;}

 
 

public boolean equals(Object other){

if(other instanceof Pessoa && ((Pessoa)other).nome.equals(nome)) return true;

return false;        

}

public int hashCode(){

// este código é identico a se não tivessemos sobrescrevido hashCode.

return super.hashCode();

}

}

 
 

public class Teste {

public static void main(String[] args) {

Pessoa p1 = new Pessoa(“Jose”);

Pessoa p2 = new Pessoa(“Jose”);

 
 

Set h = new HashSet();

 
 

System.out.println(h.add(p1));

System.out.println(h.add(p2));

System.out.println(h.size());        

}

}

 
 

Output:

true

true

2

 
 

 
 

 
 

 
 

 
 

 
 

Se mudarmos o retorno do método hashCode() para: return 1, o output do código Teste será:

 
 

Output

true

false (não permitiu a inserção de um objeto igual)

1

 
 

 
 

 
 

 
 

 
 

Como hashCode agora é igual (porém não eficiente) ao armazenar um novo item, a HashSet sempre irá verificar no ‘balde’ correto se já há um item igual (com equals) caso isso seja verdadeiro a HashSet não adiciona o item.

 
 

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