GeeksforGeeks

Como sabemos que um conjunto é um bem definido conjunto de objetos distintos. Cada membro de um conjunto é chamado de elemento do conjunto. Portanto, em outras palavras, podemos dizer que um conjunto nunca conterá elementos duplicados. Mas como em Java Set interface implementou classes como HashSet, LinkedHashSet, TreeSet etc. alcance essa singularidade. Neste post, discutiremos a verdade oculta por trás dessa singularidade.

como o HashSet funciona internamente em Java?

Leitor de atenção! Não pare de aprender agora. Aproveite todos os conceitos importantes de fundação e Coleções Java com os fundamentos do curso de Coleções Java e Java a um preço amigável para os alunos e torne-se pronto para a indústria. Para completar sua preparação de aprender um idioma para DS Algo e muitos mais, consulte o curso completo de Preparação para entrevistas.

Como Set / HashSet funciona internamente em Java
vamos entender isso com um exemplo.Vamos ver a saída do seguinte programa que tenta adicionar elementos duplicados em um HashSet.

import java.util.HashSet;
class Test
{
public static void main(String args)
{
HashSet hs = new HashSet();
boolean b1 = hs.add("Geeks");
boolean b2 = hs.add("GeeksforGeeks");
boolean b3 = hs.add("Geeks");
System.out.println("b1 = "+b1);
System.out.println("b2 = "+b2);
System.out.println("b3 = "+b3);
System.out.println(hs);
}
}



Saída:

b1 = trueb2 = trueb3 = false

agora, a partir da saída, fica claro que, quando tentamos adicionar um elemento duplicado a um conjunto usando o método add (), ele retorna false e o elemento não é adicionado ao hashset, pois já está presente. Agora vem a questão, como o método add() verifica se o conjunto já contém o elemento especificado ou não. Será mais claro se tivermos uma olhada mais de perto no método add() e no construtor padrão na classe HashSet.

// predefined HashSet classpublic class HashSet{ // A HashMap object private transient HashMap map; // A Dummy value(PRESENT) to associate with an Object in the Map private static final Object PRESENT = new Object(); // default constructor of HashSet class // It creates a HashMap by calling // default constructor of HashMap class public HashSet() { map = new HashMap(); } // add method // it calls put() method on map object // and then compares it's return value with null public boolean add(E e) { return map.put(e, PRESENT)==null; } // Other methods in Hash Set}

agora, como você pode ver, sempre que criamos um HashSet, ele cria internamente um HashMap e, se inserirmos um elemento neste HashSet usando o método add (), ele realmente chama o método put() no objeto HashMap criado internamente com o elemento que você especificou como seu objeto chave e constante chamado “presente” como seu valor. Portanto, podemos dizer que um conjunto atinge exclusividade internamente por meio do HashMap. Agora, toda a história vem em torno de como um método HashMap e put() funciona internamente.

como sabemos em um HashMap, cada chave é única e, quando chamamos o método put(Key, Value), ela retorna o valor anterior associado à chave ou null se não houver mapeamento para a chave. Então, no método add (), verificamos o valor de retorno do mapa.coloque (chave, valor) método com valor nulo.

  1. se o mapa.put (key, value) retorna null e, em seguida, a instrução “map.put (e, PRESENT) = = null ” retornará true e o elemento será adicionado ao HashSet(internamente HashMap).
  2. se o mapa.put (key, value) retorna o valor antigo da chave e, em seguida, a instrução “map.put (e, PRESENT) = = null ” retornará false e o elemento não será adicionado ao HashSet(internamente HashMap).

como LinkedHashSet estende HashSet, então ele chama internamente construtores de HashSet usando super(). Da mesma forma, criar um objeto da classe TreeSet cria internamente objeto de mapa navegável como mapa de apoio.

artigo relacionado: como o HashMap funciona internamente em Java.

este artigo é contribuído por Gaurav Miglani. Se você gosta de GeeksforGeeks e gostaria de contribuir, Você também pode escrever um artigo usando contribuir.geeksforgeeks.org ou envie seu artigo para [email protected]. veja seu artigo aparecendo na página principal do GeeksforGeeks e ajude outros Geeks.

Deixe uma resposta

O seu endereço de email não será publicado.