"Se um trabalhador quiser fazer bem o seu trabalho, ele deve primeiro afiar suas ferramentas." - Confúcio, "Os Analectos de Confúcio. Lu Linggong"
Primeira página > Programação > Explorando HashSet: um mergulho em coleções não ordenadas

Explorando HashSet: um mergulho em coleções não ordenadas

Publicado em 2024-11-08
Navegar:718

Exploring HashSet: A Dive into Unordered Collections

Introdução

A classe HashSet faz parte do Java Collections Framework, fornecendo uma coleção rápida e não ordenada que não permite elementos duplicados. Ele é construído sobre o HashMap, o que significa que herda os mesmos benefícios de complexidade de tempo, mas se concentra puramente na exclusividade do elemento. Neste artigo, exploraremos como o HashSet funciona, o que o torna único e por que é diferente de outras coleções.


O que é um HashSet?

Um HashSet é:

  • Não ordenado: Os elementos não têm sequência previsível.
  • Único: elementos duplicados são ignorados.
  • Apoiado internamente por um HashMap: Ele usa um HashMap para armazenar elementos, focando apenas nas chaves enquanto descarta valores.
  • O(1) complexidade de tempo médio: Operações como inserção, exclusão e pesquisa são altamente eficientes.

1. Inicializando um HashSet

// Parameterized constructor with initial capacity
Set setWithInitialCapacity = new HashSet(5);

// Parameterized constructor using a collection
Set setWithCollection = new HashSet(Arrays.asList(4, 4, 3));

// Default constructor with default capacity 16
Set set = new HashSet();

Explicação:

  • Construtor padrão: Cria um HashSet com capacidade inicial de 16.
  • Construtor parametrizado: Você pode especificar a capacidade inicial, mas observe que capacidade não é o mesmo que tamanho. O tamanho refere-se ao número real de elementos no conjunto.
  • Usando uma coleção: Um HashSet pode ser criado a partir de uma coleção como uma lista, garantindo que apenas elementos únicos sejam retidos.

2. Adicionando elementos a um HashSet

set.add(1);
set.add(2);
set.add(1); // Duplicate value is ignored
System.out.println(set); // Output -> [1, 2]

Explicação:

  • O método add() insere elementos no HashSet.
  • Elementos duplicados são ignorados. Quando você tenta adicionar 1 duas vezes, apenas a primeira ocorrência é retida.

Principal vantagem

Se você precisar substituir valores duplicados em vez de ignorá-los, HashSet não será a escolha certa. Isso ocorre porque ele prioriza a exclusividade do elemento.


3. Verificando tamanho versus capacidade

// Parameterized constructor with initial capacity
Set setWithInitialCapacity = new HashSet(5);
System.out.println(setWithInitialCapacity.size()); // Output -> 0

Mesmo que a capacidade de setWithInitialCapacity seja 5, o tamanho é 0 porque o tamanho reflete o número de elementos presentes no conjunto, não a capacidade inicial. Você pode pensar na capacidade como o espaço de armazenamento interno, que se ajusta conforme os elementos são adicionados.


4. Usando HashSet com coleções

// Parameterized constructor using a collection
Set setWithCollection = new HashSet(Arrays.asList(4, 4, 3));
System.out.println(setWithCollection); // Output -> [3, 4] or [4, 3]

Explicação:

  • Embora três elementos tenham sido fornecidos na lista (4, 4, 3), o valor duplicado 4 foi descartado, restando apenas dois elementos (3 e 4).
  • A ordem dos elementos é imprevisível porque o HashSet não mantém nenhuma inserção ou ordem natural.

Se você precisar reter elementos classificados, considere usar um TreeSet, que garante que os elementos sejam organizados em ordem crescente.


5. Indexação em HashSet – é possível?

Em entrevistas, uma pergunta comum é se você pode recuperar um índice de um elemento em um HashSet. A resposta é Não, porque HashSet usa um mecanismo de hashing para armazenar elementos, não uma estrutura baseada em índice como uma lista ou um array.


Resumo dos pontos principais

  1. Não ordenado e único: HashSet retém apenas elementos únicos, ignorando duplicatas.
  2. Construído em HashMap: Ele usa as chaves de um HashMap interno para armazenar elementos.
  3. Operações rápidas: A complexidade média do tempo é O(1) para adicionar, remover e verificar elementos.
  4. Capacidade vs Tamanho: Capacidade é o espaço alocado, enquanto tamanho é o número real de elementos.
  5. Sem indexação: Você não pode recuperar elementos por índice devido ao mecanismo de hash.

Relação com HashMap

Como HashSet é apoiado por um HashMap, ele usa as chaves do mapa para armazenar elementos, enquanto os valores são irrelevantes. É por isso que cada elemento em um HashSet deve ser único, assim como as chaves em um HashMap.


Conclusão

HashSet é uma ferramenta poderosa quando você precisa de uma coleção rápida e desordenada que evite duplicatas. Embora ofereça complexidade de tempo O(1) para a maioria das operações, faltam recursos como classificação e indexação. Para os desenvolvedores, saber como o HashSet se relaciona com o HashMap ajuda a entender seu funcionamento interno e a fazer melhor uso da estrutura de coleções.

Na próxima postagem, exploraremos uma pergunta comum frequentemente feita em entrevistas para testar o conhecimento dos candidatos sobre conceitos de coleções.


Postagens relacionadas

  • Fundamentos de Java

  • Fundamentos da entrevista de matriz

  • Fundamentos da memória Java

Boa codificação!

Declaração de lançamento Este artigo foi reproduzido em: https://dev.to/arshisaxena26/exploring-hashset-a-dive-into-unordered-collections-4ehb?1 Se houver alguma violação, entre em contato com [email protected] para excluí-la
Tutorial mais recente Mais>

Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.

Copyright© 2022 湘ICP备2022001581号-3