HashSet.

Serie - Fundamentos de Estrutura de Dados Elementar com Java.


HashSet. Como Funciona o Hash Table com Set.

  O HashSet, assim como o HashMap, é uma estrutura de dados baseada em tabelas de hash. Embora ambos compartilhem a ideia de associação chave-valor <K, V>, no HashSet essa relação é um pouco diferente. Ao contrário do HashMap, não tratamos diretamente de chaves no HashSet. A chave é utilizada apenas para garantir a ausência de duplicatas de dados, utilizando o hash. Em resumo, o HashSet é semelhante ao HashMap, mas com foco na exclusividade dos dados, evitando duplicatas.

  O funcionamento é o seguinte: ao adicionar um elemento, o HashSet recebe esse elemento, e a função hash é aplicada a ele. Em outras palavras, o hash é gerado com base nos dados que estamos inserindo. Para recuperar um dado na estrutura, utilizamos o próprio dado enviado, que é transformado em hash para realizar a busca na estrutura.

  Então, qual é a vantagem? Enquanto no HashMap podemos verificar a existência de algo sem possuir todos os dados, utilizando apenas a chave, no HashSet precisamos do dado completo. O Set é ideal para casos em que desejamos evitar duplicatas de dados e verificar a existência desses dados (retornando verdadeiro ou falso) durante a manipulação da estrutura.

  exemplo em código:

var names = new HashSet<String>();
names.add("gulybyte");
names.add("Aulus");
names.add("Donald Knuth");
System.out.println(names.contains("gulybyte"));
System.out.println(names.contains("John Doe"));
Output (clique)

  true
  false

  imagem mental:

  HashSet Java

  Observe que as informações não serão dispostas de forma organizada, nem mesmo por inserção.

E se houver colisões?

  Aqui a resposta é simples: nos bastidores, o HashSet usa o HashMap. Em outras palavras, ele abstrai para nós a necessidade de lidar diretamente com chaves.

  Dado que o HashSet implementa o HashMap, a abordagem para lidar com colisões é a mesma. Vamos usar o mesmo exemplo que utilizamos no HashMap.

  exemplo em código:

var names = new HashSet<String>();
names.add("John Carmack");
names.add("Ea");
names.add("Cormen");
names.add("FB");
System.out.println(names);
Output (clique)

  [Cormen, John Carmack, Ea, FB]

  imagem mental:

  HashSet Colisão Java

  Nesta representação visual, optei por retratar o HashSet de forma mais abstrata, diferentemente de incluir os Nodes como fizemos no HashMap, para variar um pouco e facilitar o entendimento.

Vantagens e Desvantagens

Vantagens
  • 1 - Fornece uma coleção de elementos únicos com acesso rápido.
  • 2 - Implementa um algoritmo de tabela de hashing eficiente, sem duplicação de dados. Eficiente para verificar a existência de elementos.
Desvantagens
  • 1 - Não mantém a ordem dos elementos e pode ter colisões.
  • 2 - Sua função de hash hashCode pode levar a colisões frequentes.

Uso comum

  Verificação eficiente de unicidade de elementos em uma coleção.

  Cenário de uso: Em um sistema de gerenciamento de permissões, um HashSet pode ser usado para armazenar os papéis atribuídos a um usuário, garantindo que não haja duplicatas e facilitando a verificação de permissões.