Diferença entre HashSet e HashMap?

168

Além do fato de HashSetnão permitir valores duplicados, qual é a diferença entre HashMape HashSet?

Quero dizer implementação sábio? É um pouco vago, porque ambos usam tabelas de hash para armazenar valores.

SpikETidE
fonte
HashSet é implementado usando HashMap
therealprashant
Eu acho que saber por que HashSet é diferente do ArrayList vai ajudar você a entender a resposta à sua pergunta acima: stackoverflow.com/questions/18706870/...
djangofan

Respostas:

150

Eles são construções completamente diferentes. A HashMapé uma implementação de Map. Um mapa mapeia chaves para valores. A pesquisa de chave ocorre usando o hash.

Por outro lado, a HashSeté uma implementação de Set. Um conjunto é projetado para corresponder ao modelo matemático de um conjunto. A HashSetusa a HashMappara respaldar sua implementação, como você observou. No entanto, implementa uma interface totalmente diferente.

Quando você está procurando o que será melhor Collectionpara seus objetivos, este Tutorial é um bom ponto de partida. Se você realmente quer saber o que está acontecendo, há um livro para isso também.

justkt
fonte
Essa afirmação é um pouco simplista. Há mais algumas coisas ocultas "" "Retorna um valor de hash para o objeto especificado. Além do hashCode do próprio objeto, esse método aplica uma "função hash suplementar", que defende contra funções hash de baixa qualidade. Isso é crítico porque o HashMap usa tabelas de hash de dois comprimentos. " Weblogs.java.net/blog/2005/06/18/hashmap-implementation - no entanto, se você olhar para o documento, verá que esse hash distribui coisas sobre "buckets", então no final eu acredito que duas coisas podem ser mapeadas no mesmo bucket.
justkt
1
Para responder à sua segunda pergunta - não. Um mapa é se você deseja (chave -> valor), conforme definido pela excelente resposta de @Bruno Rothgiesser. Um conjunto é para elementos não duplicados. Se você deseja duplicatas e não key-> value, eu verificaria uma implementação java.util.List. Confira o tutorial de coleção para obter um guia definitivo: java.sun.com/docs/books/tutorial/collections/index.html
justkt
@justk: sim, você pode obter duas chaves em um balde e depois igual a () é usado para distinguir entre elas. É por isso que é essencial que hashCode () e equals () sejam compatíveis.
Michael Borgwardt 5/05
6
@SpikETidE: nem o HashMap nem o HashSet permitem duplicatas. Esse é o ponto.
Michael Borgwardt 5/05
23
@SpikETidE: um conjunto não possui pares de chave / valor, apenas elementos. E o HashSet é implementado com um HashMap com os elementos definidos como chaves e o valor sendo ignorado.
Michael Borgwardt 5/05
300

HashSet é um conjunto , por exemplo, {1,2,3,4,5}

O HashMap é um mapa de chave -> valor (chave para valor), por exemplo, {a -> 1, b -> 2, c -> 2, d -> 1}

Observe no meu exemplo acima que no HashMap não deve haver chaves duplicadas, mas pode ter valores duplicados.

No HashSet, não deve haver elementos duplicados.

caldo
fonte
Mas a razão (mais interessante) para a confusão é que, mesmo no HashSet, você precisa de uma "chave" para acessar os elementos. Ou seja, objetos, mesmo em matemática, têm nomes (ou endereços), se quiserem ser acessados ​​ou referenciados. Portanto, nesse sentido real, um HashSet é um HashMap especialmente simples, digitado com os nomes (ou endereços) de seus elementos.
Andrew Marshall
65

HashSet

  1. A classe HashSet implementa a interface Set
  2. No HashSet, armazenamos objetos (elementos ou valores), por exemplo, se tivermos um HashSet de elementos de sequência, ele poderá representar um conjunto de elementos HashSet: {"Olá", "Oi", "Tchau", "Executar"}
  3. O HashSet não permite elementos duplicados, o que significa que você não pode armazenar valores duplicados no HashSet.
  4. HashSet permite ter um único valor nulo.
  5. O HashSet não é sincronizado, o que significa que eles não são adequados para operações seguras para threads, a menos que sejam sincronizados explicitamente.

                          add      contains next     notes
    HashSet               O(1)     O(1)     O(h/n)   h is the table 

HashMap

  1. A classe HashMap implementa a interface do Mapa
  2. O HashMap é usado para armazenar pares de chave e valor. Em resumo, ele mantém o mapeamento da chave e do valor (a classe HashMap é aproximadamente equivalente à Hashtable, exceto que é não sincronizada e permite nulos.) É assim que você pode representar os elementos do HashMap se tiver uma chave inteira e valor do tipo String: por exemplo, {1 -> "Olá", 2 -> "Oi", 3 -> "Tchau", 4 -> "Executar"}
  3. O HashMap não permite chaves duplicadas, no entanto, permite ter valores duplicados.
  4. O HashMap permite uma chave nula única e qualquer número de valores nulos.
  5. O HashMap não é sincronizado, o que significa que eles não são adequados para operações com segurança de thread até que sejam sincronizados explicitamente. [Similaridade]

                           get      containsKey next     Notes
     HashMap               O(1)     O(1)        O(h/n)   h is the table 

Consulte este artigo para encontrar mais informações.

Avanish Kumar
fonte
36

É realmente uma pena que os nomes deles comecem com Hash . Essa é a parte menos importante deles. As partes importantes vêm depois do Hash - o Conjunto e o Mapa , como outros já apontaram. O que são, respectivamente, são um conjunto - uma coleção não ordenada - e um mapa - uma coleção com acesso por chave. Eles são implementados com hashes - é daí que os nomes vêm - mas sua essência está oculta por trás dessa parte de seus nomes.

Não se confunda com os nomes deles; eles são coisas profundamente diferentes.

Carl Manaster
fonte
@HiteshSahu Ambos são implementados com tabelas de hash ( en.wikipedia.org/wiki/Hash_table ). Essa é uma boa estrutura de dados para representar um conjunto, eficiente da maneira correta e, essencialmente, as chaves de um HashMap são implementadas como um HashSet. Portanto, quem quer que os nomeou teve algum problema para implementá-los e estava focado na implementação e não no seu objetivo (em suposição).
Carl Manaster
1
Bem explicado. Obrigado.
user3932000
5

O HashsetInternamente implementa HashMap. Se você vir a implementação interna, os valores inseridos no HashSet são armazenados como chaves no HashMap e o valor é um objeto Dummy da classe Object.
A diferença entre HashMap e HashSet é: -

  1. HashMap contém pares de valores-chave e cada valor pode ser acessado por chave, onde o HashSet precisa ser iterado sempre que não houver método get.
  2. HashMapimplementa a interface Map e permite um valor nulo como chave e vários valores nulos como valores. Onde HashSetimplementa a interface Set, permite apenas um valor nulo e nenhum valor duplicado. (Lembre-se de que uma chave nula é permitida na chave HashMap, portanto, um valor nulo no HashSet como o HashSet implementa o HashMap internamente).
  3. HashSete HashMapnão mantém a ordem de inserção durante a iteração.
Abhay S
fonte
3

O HashSet nos permite armazenar objetos no conjunto, como o HashMap nos permite armazenar objetos com base na chave e no valor. Todo objeto ou objeto armazenado terá chave.

Spidfire
fonte
2

Como os nomes sugerem, um HashMap é um mapa associativo (mapeamento de uma chave para um valor), um HashSet é apenas um conjunto .

leonbloy
fonte
2
@SpikETidE Esse é um detalhe de como a exclusividade é implementada, mas o significado do HashSet é implementar um conjunto.
Michael Borgwardt 5/05
1
então .. tudo se resume a "se você não deseja duplicatas, use o hashSet ... Se você não se preocupa com duplicatas, use o HashMap" ....?
SpikETidE
3
Java não implementa uma classe específica para uma "coleção com elementos potencialmente duplicados" (uma "bolsa"), você pode usar uma Lista para isso (embora uma Lista inclua alguma semântica na bolsa: order; mas você pode ignorá-la).
Leonbloy 5/05
2

Diferenças entre HashSet e HashMap em Java

1) A primeira e mais significativa diferença entre o HashMap e o HashSet é que o HashMap é uma implementação da interface Map, enquanto o HashSet é uma implementação da interface Set, o que significa que o HashMap é uma estrutura de dados baseada em valores-chave e o HashSet garante a exclusividade ao não permitir duplicados. O HashSet é um invólucro do HashMap em Java. Se você observar o método add (E e) do HashSet.java, verá o seguinte código:

public boolean add(E e) 
{
    return map.put(e, PRESENT)==null;
}

onde colocar Objeto no mapa como chave e valor é um objeto final PRESENT que é fictício.

2) A segunda diferença entre o HashMap e o HashSet é que, usamos o método add () para colocar elementos em Set, mas usamos o método put () para inserir chave e valor no HashMap em Java.

3) O HashSet permite apenas uma chave nula, mas o HashMap pode permitir uma chave nula + vários valores nulos.

Isso é tudo sobre a diferença entre HashSet e HashMap em Java. Em resumo, HashSet e HashMap são dois tipos diferentes de coleção, sendo um definido e outro sendo mapa.

Vibha Sanskrityayan
fonte
2

Diferenças entre HashSet e HashMap em Java

O HashSet usa internamente o HashMap para armazenar objetos. Quando o método add (String) chamado chama método HahsMap put (key, value) em que key = String object & value = new Object (Dummy). Para que ele não mantenha duplicatas porque as chaves nada mais são do que Value Objeto.

os objetos armazenados como chave no Hashset / HashMap devem substituir o código de hash e o contrato igual.

As chaves usadas para acessar / armazenar objetos de valor no HashMap devem ser declaradas como Final porque, quando modificado, o objeto Valor não pode ser localizado e retorna nulo.

user3539704
fonte
1

A HashMapé adicionar, obter, remover, ... objetos indexados por uma chave personalizada de qualquer tipo.
A HashSeté adicionar elementos, remover elementos e verificar se há elementos comparando seus hashes.

Portanto, um HashMap contém os elementos e um HashSet lembra seus hashes.

Martijn Courteaux
fonte
1
Comparando seus hashes e chamando seus equals()métodos.
Marquês de Lorne
1

Diferenças: em relação à hierarquia: HashSet implementa Set. O HashMap implementa o Map e armazena um mapeamento de chaves e valores.

Um uso do HashSet e HashMap em relação ao banco de dados ajudaria você a entender o significado de cada um.
HashSet: geralmente é usado para armazenar objetos de coleção exclusivos. Por exemplo: pode ser usado como classe de implementação para armazenar a relação de muitos para um entre o
item da classe e o lance de classe, onde (o item possui muitos lances) HashMap: é usado para mapear uma chave para o valor. O valor pode ser nulo ou qualquer objeto / list of Object (que é objeto em si).

frictionlesspulley
fonte
0

Um HashSet é implementado em termos de um HashMap . É um mapeamento entre a chave e um objeto PRESENT.

Matthew Flaschen
fonte
5
O que é um 'objeto PRESENTE'?
Marquês de Lorne
0

Um HashSet usa um HashMap internamente para armazenar suas entradas. Cada entrada no HashMap interno é codificada por um único Objeto, para que todas as entradas sejam hash no mesmo bucket. Não me lembro do que o HashMap interno usa para armazenar seus valores, mas isso realmente não importa, pois esse contêiner interno nunca conterá valores duplicados.

EDIT : Para abordar o comentário de Matthew, ele está certo; Eu tive isso ao contrário. O HashMap interno é digitado com os Objetos que compõem os elementos Set . Os valores do HashMap são um Objeto simplesmente armazenado nos depósitos do HashMap.

Andy Gherna
fonte
Isso não está certo. Os elementos do conjunto são usados ​​diretamente como chaves HashMap.
Matthew Flaschen 5/05
0

HashMapé uma Mapimplementação, permitindo valores duplicados, mas não chaves duplicadas. . Para adicionar um objeto, é necessário um par Chave / Valor. Chaves nulas e valores nulos são permitidos. por exemplo:

{O-> 3, mundo-> 5, é-> 2, legal-> 4}

HashSeté uma Setimplementação que não permite duplicatas . Se você tentou adicionar um objeto duplicado, uma chamada ao public boolean add(Object o)método, o conjunto permanece inalterado e retorna false. por exemplo:

[O mundo é legal]

Minnie
fonte
-1

você praticamente respondeu sua própria pergunta - o hashset não permite valores duplicados. seria trivial criar um hashset usando um hashmap de backup (e apenas uma verificação para ver se o valor já existe). Eu acho que as várias implementações java fazem isso ou implementam algum código personalizado para fazê-lo de forma mais eficiente.

chris
fonte
1
@oedo - java.util.HashSetdiz que é apoiado por um java.util.HashMap.
Just
2
Não permitir duplicatas não é uma diferença entre elas.
Marquês de Lorne
-1

Basicamente, no HashMap, o usuário precisa fornecer a Chave e o Valor, enquanto no HashSet você fornece apenas o Valor, a Chave é derivada automaticamente do Valor, usando a função hash. Portanto, depois de ter chave e valor, o HashSet pode ser armazenado como HashMap internamente.

Munish Goyal
fonte
A chave é o valor em um HashSet.
Marquês de Lorne
-1

HashSet e HashMap ambos os pares de lojas, a diferença está no HashMap que você pode especificar uma chave enquanto no HashSet a chave vem do código hash do objeto

prateeksarda
fonte
Se isso fosse verdade, o HashSet não poderia armazenar vários objetos com o mesmo hashCode, e o faz.
Marquês de Lorne
-1

HashMapspermita uma chave nula e valores nulos. Eles não são sincronizados, o que aumenta a eficiência. Se necessário, você pode sincronizá-los usandoCollections.SynchronizedMap()

Hashtables não permitem chaves nulas e são sincronizadas.

Appesh
fonte
Ele não perguntou sobre Hashtables. Não responde a pergunta.
Marquês de Lorne
-2

HashMap é uma implementação da interface do Mapa HashSet é uma implementação da Interface do Conjunto

HashMap Armazena dados em forma de par de valores-chave HashSet Armazena apenas objetos

O método Put é usado para adicionar elemento no mapa. O método Put é usado para adicionar elemento.

No mapa de hash, o valor do código de hash é calculado usando o objeto-chave Aqui, o objeto membro é usado para calcular o valor do código de hash, que pode ser o mesmo para dois objetos, para que o método equal () seja usado para verificar a igualdade se retornar false, o que significa que dois objetos são diferentes.

O HashMap é mais rápido que o hashset porque a chave exclusiva é usada para acessar o objeto HashSet é mais lenta que o Hashmap

Hengameh
fonte
1
Eles têm desempenho essencialmente idêntico e 'porque a chave exclusiva é usada' está incorreta.
Marquês de Lorne