HashSet em Java
Crie um HashSet<String> chamado tags, chame tags.add("oak");, depois tags.add("pine");, depois tags.add("oak"); de novo, e imprima tags.size(). Compile Bin.java e execute java Bin. A tela deve mostrar uma linha: 2. O segundo oak não criou um terceiro valor. Valores únicos em um set é o que esta página ensina.
Valores únicos, não pares chave-e-valor
Na página HashMap você guardava uma chave que apontava para um valor com put e get. Um HashSet guarda valores sozinhos. Cada valor aparece no máximo uma vez. Se você fizer add da mesma palavra duas vezes, o set ainda a mantém uma vez. Não há string de chave separada no caminho de ensino desta página.
Abra Bin.java. Mantenha o nome da classe pública Bin para combinar com o nome do arquivo. Apague linhas restantes de HashMap, scores.put, scores.get e qualquer demo Desk. Elas pertencem à página do map. Apague também qualquer resto de ArrayList, Rack, Scanner ou nextLine. O programa não deve esperar digitação.
Perto do topo, acima de public class Bin, escreva:
import java.util.HashSet;
Esse import traz o tipo HashSet ao alcance do nome curto. Sem ele, javac não vê o nome curto HashSet nesta página. Escreva java.util e HashSet com cuidado. Não invente import java.util.*; como exigência aqui — um import exato basta.
Dentro de main, crie o set:
HashSet<String> tags = new HashSet<String>();
Os colchetes angulares carregam String porque esta lição guarda palavras. O nome tags é o que você mantém. A chamada new HashSet<String>() constrói um set vazio. Neste momento ele tem zero valores.
Adicione oak, pine, oak de novo — depois size
Chame tags.add("oak"); em sua própria linha. Depois chame tags.add("pine");. Depois chame tags.add("oak"); uma terceira vez com a mesma palavra. A terceira chamada não aumenta o set. Depois escreva:
System.out.println(tags.size());
Imprima o tamanho, não o set inteiro, para o primeiro arquivo mantido. O número 2 prova que o duplicado foi ignorado. Salve antes de compilar.
import java.util.HashSet;
public class Bin {
public static void main(String[] args) {
HashSet<String> tags = new HashSet<String>();
tags.add("oak");
tags.add("pine");
tags.add("oak");
System.out.println(tags.size());
}
}
Da pasta que contém Bin.java, execute javac Bin.java. Quando parênteses, chaves, colchetes angulares e ponto e vírgula combinam, javac não escreve nenhuma linha própria. Depois execute java Bin — não java Bin.java, e não java HashSet. Tire o final .java do comando de execução.
O programa deve imprimir uma linha e parar: 2. Não deve pedir que você digite. Se o terminal esperar entrada do teclado, ainda há uma chamada nextLine de um exercício mais antigo em algum arquivo. Apague essa chamada e mantenha a criação, as três linhas add e System.out.println(tags.size());.
Percorra a execução uma vez. Java começa em Bin.main. O import já nomeou qual HashSet você quer. A linha new constrói um set vazio. O primeiro add guarda oak. O segundo guarda pine. O terceiro add("oak") encontra oak já presente e não sobe a contagem. A impressão de size() escreve 2. A tela mostra 2. Nada mais deve imprimir. Se você ver 3, não está executando este arquivo HashSet, ou adicionou uma terceira palavra diferente como elm. Se ver leaf, ainda roda um demo HashMap de Desk — mude para java Bin. Se ver [oak, pine] você imprimiu o set inteiro em vez de size(); mantenha a impressão do tamanho para este primeiro arquivo de ensino.
Se javac disser que não encontra HashSet, a linha de import está faltando, mal escrita ou depois de public class Bin. Mova import java.util.HashSet; acima da linha da classe. Se escrever tags.add(oak); sem aspas, javac trata oak como um nome faltando. Mantenha as aspas. Não chame put em um HashSet nesta página — esse nome pertence a HashMap.
Pergunte com contains
Um segundo arquivo Bin verifica se oak está no set depois dos mesmos dois primeiros adds.
import java.util.HashSet;
public class Bin {
public static void main(String[] args) {
HashSet<String> tags = new HashSet<String>();
tags.add("oak");
tags.add("pine");
System.out.println(tags.contains("oak"));
}
}
Compile e execute esse segundo arquivo do mesmo modo. A tela mostra true. A chamada contains("oak") pergunta se esse valor está no set. Retorna um boolean. Se perguntar contains("elm") depois de adicionar só oak e pine, a tela mostraria false — isso é válido, mas o segundo arquivo mantido usa "oak" para a tela ser true.
Não invente um loop sobre o set como exigência nesta página. Uma página posterior — iterating — percorre coleções. Fique aqui com add, size e contains.
Lado a lado com HashMap
Uma tabela curta mantém a diferença clara.
📊 HashSet vs HashMap
| Piece | On this page |
|---|---|
| store | tags.add("oak"); — value only |
| duplicate | second add("oak") does not grow size |
| read check | tags.contains("oak") → true |
| HashMap leftover | put / get — not this page’s path |
A tabela é só um lembrete. As peças digitadas que você mantém são o import HashSet, a linha de criação, as chamadas add, size() e contains. |
Comparado com HashMap e com ArrayList
Na página HashMap, put e get usavam uma chave. Nesta página, add e contains usam o valor em si. Um arquivo Desk restante que imprime leaf é outra lição. Para esta página mantenha HashSet<String> tags e o demo de tamanho que imprime 2.
Um ArrayList pode guardar a mesma palavra duas vezes. Um HashSet não cresce para um segundo add idêntico dessa palavra. Essa unicidade é o ponto desta lição. Não misture tags.get(0) nos demos Bin — sets não usam números de slot de lista nesta página.
Quando arquivos antigos Desk.java ou Rack.java ainda estiverem perto, deixe-os ou apague-os só se confundirem qual classe você executa. Execute java Bin depois de compilar o arquivo HashSet desta lição.
O que fica para iterating
Esta página abre um set de valores únicos. A próxima página percorre coleções com um loop. Fique aqui com add, size e contains. Não invente um for-each sobre o set como exigência nesta página; o objetivo da lição é a unicidade e a tela 2 de size().
Antes de iterating
Você pode importar java.util.HashSet, criar HashSet<String> tags, adicionar oak, pine e oak de novo, e depois imprimir tags.size() para ver 2. Um segundo arquivo pode imprimir tags.contains("oak") para ver true. Compile Bin.java e execute java Bin para cada demo mantido. O set manteve valores únicos. A próxima página é iterating, onde você percorre os valores de uma coleção um a um.
Mantenha o import acima da classe. Mantenha o add("oak") duplicado no demo de tamanho para a contagem ficar 2. Mantenha contains para a verificação boolean. Esses hábitos são o ponto de checagem desta página antes de seguir. Quando size() mostrar 2 depois de três adds com oak repetido, HashSet fez o trabalho desta lição e você está pronto para o próximo tópico.
🧠 Teste Seu Conhecimento
Teste Seu Conhecimento
Desafie-se com este questionário interativo e veja o quão bem você entende o tópico
📝 Instruções
- Leia cada pergunta cuidadosamente
- Selecione a melhor resposta para cada pergunta
- Você pode refazer o quiz quantas vezes quiser
- Seu progresso será mostrado no topo