Quando você aprende uma nova linguagem de computador, uma das primeiras coisas que você costuma perguntar é como trabalhar com grandes grupos de dados. Este tópico é frequentemente abordado no tópico "Estruturas de dados". Se você se aprofundar, deve abordar tópicos como listas vinculadas, filas, pilhas e árvores binárias, entre muitas outras estruturas de dados. Em Java, essas estruturas fazem parte do Java Collections Framework. Uma coleção nada mais é do que um tipo de estrutura de dados que se refere a um agrupamento de vários elementos de dados e o Java Collections Framework padroniza a maneira pela qual esses grupos de objetos são manipulados. De fato, a estrutura de coleções foi projetada para atender a vários objetivos.
Toda a estrutura de coleções é projetada em torno de um conjunto de interfaces padrão. Várias implementações padrão, como LinkedList, HashSet e TreeSet, são fornecidas por essas interfaces que você pode ter. Além disso, você também pode implementar sua própria coleção, se desejar. No entanto, além das coleções, a estrutura define várias interfaces e classes de mapas. Java contém três implementações de mapa de uso geral - HashMap, TreeMap e LinkedHashMap - que armazenam pares de chave / valor. Embora os mapas não sejam tecnicamente coleções, eles são totalmente integrados às coleções. De fato, os mapas focam em grupos de associação entre objetos. Este artigo resume as principais diferenças entre o HashMap e o HashSet.
O HashMap é a implementação mais usada da interface Map, que fornece um mapa básico de chave / valor em que os elementos são desordenados. Ele usa um valor especial chamado código hash, em vez de uma pesquisa lenta da chave. O código de hash é uma maneira de obter informações no objeto em questão e transformá-las em um int "relativamente único" para esse objeto. Ele simplesmente funciona com o princípio de hash, o que significa que usa uma função de hash para mapear os valores de identificação. Assim como Vector e Stack têm suas substituições em ArrayList e LinkedList, o Hashtable tem uma substituição no HashMap. Ele estende o AbstractMap para implementar a interface do Mapa usando uma representação Hashtable interna. E semelhante a outras implementações de uso geral, o HashMap suporta os métodos opcionais do Map, permite valores nulos e não é sincronizado.
O HashSet é um dos membros do Java Collections Framework que implementa a interface Set, apoiada por uma tabela de hash que é de fato uma instância do HashMap. Como o nome indica, ele é implementado por uma tabela de hash, uma matriz na qual os elementos são armazenados em uma posição derivada de seu conteúdo. Ao contrário de um mapa, Set é exatamente uma coleção com exatamente a mesma interface, portanto, não há nenhuma funcionalidade extra como em duas listas diferentes. O HashSet usa uma função de hash, projetada especificamente para pesquisas rápidas. É uma coleção não ordenada de objetos únicos que não pode armazenar valores duplicados. HashSet estende a classe AbstractSet, que implementa a interface Set. No entanto, o HashSet não define nenhum método adicional além daqueles fornecidos por suas superclasses e interfaces.
O HashMap é a implementação mais usada da interface Map, que fornece um mapa básico de chave / valor em que os elementos são desordenados. Ele simplesmente funciona com o princípio de hash, o que significa que usa uma função de hash para mapear os valores de identificação. O HashSet, por outro lado, é um dos membros do Java Collections Framework que implementa a interface Set, apoiada por uma tabela de hash que é de fato uma instância do HashMap. Simplificando, o HashMap implementa a interface Map, enquanto o HashSet implementa a interface Set.
HashSet cria uma coleção que usa uma tabela de hash para armazenamento. A tabela de hash armazena informações usando um método chamado hash. O HashSet usa uma função de hash, projetada especificamente para pesquisas rápidas, para armazenar elementos ou valores. A maioria das funcionalidades do HashSet é fornecida pelas superclasses AbstractCollection e AbstractSet, que o HashSet compartilha com o TreeSet. O HashMap estende o AbstractMap para implementar a interface do Mapa usando uma representação interna do Hashtable. Ambas as classes não são sincronizadas, o que significa que não são adequadas para operações seguras de encadeamento.
Como o Map não suporta chaves duplicadas, o HashMap não permite chaves duplicadas, mas é permitido ter valores duplicados. Isso significa que valores duplicados podem existir no HashMap, mas você pode usar a coleção como valor em relação a alguma chave. Cada chave deve ser exclusiva em um HashMap e uma única chave não pode ter mais de 1 valor. O HashSet, por outro lado, não pode ter elementos duplicados pela mera definição de um Conjunto, o que significa que você não pode armazenar valores duplicados no HashSet. O HashMap permite apenas uma chave nula, mas permite qualquer número de valores nulos, enquanto o HashSet permite apenas um valor nulo.
O HashMap trabalha com o princípio de hash, o que significa que ele usa uma função de hash para mapear a identificação de valores internamente, usando o algoritmo de hash para facilitar a recuperação. Um mecanismo de hash verdadeiro sempre retorna o mesmo hashCode () quando aplicado ao mesmo objeto. O HashSet, por outro lado, usa internamente o HashMap como uma estrutura de dados auxiliar para adicionar ou armazenar objetos. Isso significa que quando um objeto do HashSet é criado, ele cria um objeto do HashMap.
Embora o HashMap e o HashSet não sejam sincronizados, o que significa que eles não são adequados para operações seguras de encadeamento e são construções totalmente diferentes, eles fornecem desempenho de tempo constante para operações básicas, como adicionar, remover elemento etc. Embora o HashMap seja uma implementação de uso geral do a interface Map que armazena pares de chave / valor, HashSet é uma implementação da interface Set. Um HashSet usa um HashMap para apoiar sua implementação. Um HashMap, no entanto, usa o princípio de hash e utiliza-o para procurar rapidamente a chave.