neste post, veremos como o HashSet funciona internamente em Java, que também é uma questão de entrevista de coleções favouriteJava, mas antes de entrar na implementação interna do HashSet em Java, é importante saber dois pontos sobre o HashSet.
- HashSet em Java armazena apenas valores exclusivos, ou seja, não são permitidas duplicatas.
- HashSet funciona no conceito de hashing assim como HashMap em Java, mas seu trabalho difere do HashMap da seguinte maneira-
- no HashMap um par (chave, valor) é adicionado e a função hash é calculada usando a chave.
- onde como na função HashSet hash é calculado usando o próprio valor. Observe que no HashSet nós adicionamos (e e) método que leva apenas o elemento a ser adicionado como parâmetro.
também você deve ter adivinhado agora, uma vez que a função hash é calculada usando o valor, é por isso que apenas uniquevalues são armazenados no HashSet. Se você tentar armazenar o mesmo elemento novamente, a função hash calculada seria a mesma, portanto, o elemento será substituído.
HashSet usa internamente HashMap
Agora, voltando à implementação interna de HashSet em Java, o ponto mais importante é a implementação da classe HashSet usa internamente HashMap para armazenar elementos.
dentro do HashSet existem muitos construtores, um sem qualquer parâmetro e vários mais com capacidade inicial ou fator de carga, mas cada um desses Construtores cria um HashMap.Como o HashSet usa internamente o HashMap, saber como o HashMap funciona internamente em Java ajudará você a entender como o HashSet funciona internamente em Java.
HashSet Constructor snippets
na classe HashSet em Java, você pode ver que os construtores da classe criam um HashMap.
/*** Constructs a new, empty set; the backing <tt>HashMap</tt> instance has* default initial capacity (16) and load factor (0.75).*/public HashSet() { map = new HashMap<>();}
public HashSet(int initialCapacity, float loadFactor) { map = new HashMap<>(initialCapacity, loadFactor);}
E o mapa, que é usado para armazenar valores, é definido como
private transient HashMap<E,Object> map;
o construtor, se você tem notado, existem parâmetros com o nome inicial de capacidade de carga e fator.Para HashSet, a capacidade inicial padrão é 16, ou seja, uma matriz (ou bucket) de comprimento 16 seria criada e o Fator de carga default é 0,75. Onde o Fator de carga é uma medida de quão cheia a tabela hash é permitida para obter antesua capacidade é aumentada automaticamente.
como os elementos são adicionados-implementação interna do HashSet
declarei no ponto 2 acima que o HashSet calcula a função hash usando o próprio valor e não há par (chave, valor) no HashSet e, em seguida, veio a declaração de que o HashSet usa internamente o HashMap para armazenar objetos.Essas duas declarações podem parecer contraditórias, pois o par HashMap armazena (chave, valor), então vamos ver como essas duas declarações contraditórias são verdadeiras.
na verdade, a partir do método add da classe HashSet put (), o método de HashMap é chamado onde o valor, que deve ser adicionado no conjunto, se torna chave e um objeto constante “presente” é usado como valor.
Que como PRESENTE é definido no HashSet implementação-
// Dummy value to associate with an Object in the backing Mapprivate static final Object PRESENT = new Object();
E é assim que adicionar método é implementado na classe HashSet –
public boolean add(E e) { return map.put(e, PRESENT)==null;}
Assim, você pode ver com a implementação interna do HashSet é uma (chave, valor) par que está realmente chegando adicionado.Só que o valor real (que é adicionado para o HashSet) torna-se a chave e um valor fictício “PRESENTE” é adicionado como valor whenstoring no apoio HashMap.
por exemplo, uma instrução para adicionar um elemento ao HashSet-set.adicionar (“Mumbai”); internamente se traduz em mapa.put (“Mumbai”, presente); e, em seguida, adicionado à instância HashMap de apoio.
uma coisa a notar aqui é, no valor HashMap pode ser duplicado, mas a chave deve ser única. É assim que HashSetmakes certeza de que apenas valores exclusivos são armazenados nele, uma vez que o valor que deve ser armazenado no HashSetbecomes a chave ao armazená-lo em HashMap.
como o elemento é removido – implementação interna do HashSet
Quando precisamos remover um elemento do HashSet, remova internamente novamente o método de HashSetcalls remove(Object key) método do HashMap.
é assim que é implementado na classe HashSet.
public boolean remove(Object o) { return map.remove(o)==PRESENT;}
aqui, observe que o método remove (Object key) do HashMap retorna o valor associado à chave.Considerando que o método remove (Object o) do HashSet retorna o valor booleano. Também sabemos que para cada valueadded em HashSet, internamente quando é adicionado ao HashMap associado, o valor se torna chave e o valor é sempre anobject chamado presente. Portanto, o valor que é retornado do método remove(Object key) do HashMap está sempre presente, portanto, o mapa de condições.remover (o) = = presente.
como os elementos são recuperados do HashSet em Java
no HashSet não há método get conforme fornecido no mapa ou na lista. Em HashSet iterator está lá, que iteratethrough os valores do conjunto. Internamente, ele chamará o keyset do HashMap, pois os valores são armazenados como keysin o HashMap, então o que obteremos são os valores armazenados no HashSet.
é assim que o iterador é implementado internamente no HashSet em Java.
/*** Returns an iterator over the elements in this set. The elements* are returned in no particular order.** @return an Iterator over the elements in this set* @see ConcurrentModificationException*/public Iterator<E> iterator() { return map.keySet().iterator();}
pontos a serem observados
- ao contrário do HashMap, onde a função hash é calculada usando o HashSet de chave usa o próprio valor para calcular a função hash.
- como a função hash é calculada usando o valor, é por isso que apenas valores exclusivos são armazenados no HashSet.
- HashSet usa internamente HashMap para armazenar seus elementos.
- quando o elemento é adicionado ao HashSet usando add(e e) método internamente HashSet chama put() método do HashMap ondeo valor passado no método add torna-se chave no método put (). Um valor fictício “presente” é passado como valor Emo método put ().
recomendações para aprendizagem (cursos Udemy)
- curso de Masterclass de programação Java
- Java em profundidade: torne-se um engenheiro Java Completo!
- Spring Framework Master Class Curso
- Completo Python Curso Bootcamp
- Python para Ciência de Dados e Aprendizado de Máquina
isso é tudo para este tópico Como HashSet Funciona Internamente em Java. Se você tiver alguma dúvida ou alguma sugestão para fazer, deixe um comentário. Obrigado!
Tópicos Relacionados
- Como ArrayList Funciona Internamente em Java
- Como HashMap Funciona Internamente em Java
- Como LinkedList Classe Funciona Internamente em Java
- LinkedHashSet em Java, Com Exemplos
- TreeSet em Java, Com Exemplos
Você também pode gostar-