Anteriormente vimos uma das Collections que implementam a interface List, porém List, não é a única coleção existente no Java, neste tópico iremos falar da Collection Set, esta coleção tem uma peculiaridade em relação a listas comuns, ela não armazena valores repetidos, porém assim como List, o Set também é uma interface genérica.
Temos algumas implementações para esta interface
, porém iremos falar das seguintes implementações:
- HashSet
- Esta implementação é a mais rápida dentre elas, ela armazena os valores em uma Hash Table, esta implementação não garante a ordem dos elementos adicionados nela.
- LinkedHashSet
- Esta implementação é parecida com a do
HashSet
porém por trás dos panos ela utiliza uma LinkedList em sua implementação ao invés de um HashMap que sera explicado nos próximos capítulos.
- Esta implementação é parecida com a do
- TreeSet
- Esta implementação utiliza uma Red Black Tree, esta implementação garante a ordem dos elementos que forem inseridos no Set.
Cada implementação tem sua peculiaridade, mais uso de memoria porém mais rápida inserção, menos uso de memoria e mais rápida na busca, todas as implementações tem pontos fracos e fortes dependendo do tipo de algoritmo e estrutura de dados utilizada.
Iremos realizar as demonstrações utilizando o HashSet
, porém o modo de trabalho das outras duas implementações mencionadas neste capitulo.
O calculo do Hash determina a posição do elemento na HashTable, por isso não temos a ordenação garantida. Para que um HashSet do tipo escolhido funcione de maneira adequada, precisamos implementar o método hashCode
para o Objeto, muitas classes do Java já tem essa implementação por padrão Integer
, Long
, String
, Character
... Porém também podemos fazer isso para a nossa própria classe, claro não iremos fazer isso na mão aqui, iremos utilizar alguma IDE para facilitar a nossa vida, mas não agora, iremos seguir utilizando as classes que o JDK nos fornece.
Instanciando um HashSet:
public class App {
public static void main(String[] args) {
Set<Integer> intSet = new HashSet<>();
}
}
A instanciação do HashSet é simples, basicamente temos o padrão Set<Tipo> nome = new HashSet<>();
com isso já temos a instancia para trabalharmos.
Para adicionarmos itens no nosso Set utilizamos o método add
, este método irá nos retornar true
caso consiga inserir o item, e false
quando não conseguir, pois o item já existe no Set.
public class App {
public static void main(String[] args) {
Set<Integer> intSet = new HashSet<>();
intSet.add(10);
intSet.add(20);
if(intSet.add(10)) {
System.out.println("O numero '10' já existe");
}
}
}
Para removermos um item é muito parecido, utilizamos o método remove
para realizar esta ação, caso consiga remover o item irá nos retornar true
, e false
quando não conseguir, que acontece caso o item não exista no Set.
public class App {
public static void main(String[] args) {
Set<Integer> intSet = new HashSet<>();
intSet.add(10)
intSet.add(20);
if(intSet.remove(10)) {
System.out.println("O numero existe no Set e foi removido");
}
}
}
Podemos limpar um Set inteiro com o método clear
, ou ter o seu tamanho com o size
, saber se esta vázio com o isEmpty
, métodos muito parecidos com o das listas já estudadas.
public class App {
public static void main(String[] args) {
Set<Integer> intSet = new HashSet<>();
intSet.add(10)
intSet.add(20);
if (intSet.isEmpty()) {
System.out.println("Esta vazio!");
} else {
System.out.println("Não esta vazio!");
}
intSet.clear();
System.out.println("O tamanho do Set é: " + intSet.size());
}
}
O modo de trabalho com o TreeSet é praticamente o mesmo dos já mostrados aqui, com a grande diferença desta implementação utilizar o método compareTo ou compare ou invés do hashCode
para realizar as inserções, remoções e contais, não iremos discutir a implementação destes métodos, pois não é o foco deste cápitulo, a utilização destes métodos é para garantir a integridade da arvore por trás de sua implementação.
Assim como já discutido no capítulo anterior os Set's também tem suas versões imutáveis, sendo elas utilizando o Collections.unmodifiableSet
ou Set.of
, este método em especifico acima da versão 8, o comportamento é parecido com o das listas imutáveis, porém com as peculiaridades do Set.
Próximo - Map