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"));
true
false
imagem mental:
Observe que as informações não serão dispostas de forma organizada, nem mesmo por inserção.
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);
[Cormen, John Carmack, Ea, FB]
imagem mental:
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.
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.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.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.