|
| 1 | +# <center>Sets</center> |
| 2 | + |
| 3 | +Anteriormente vimos uma das Collections que implementam a interface [List](https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/List.html), porém List, não é a única coleção existente no Java, neste tópico iremos falar da Collection [Set](https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/Set.html), 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. |
| 4 | + |
| 5 | +Temos algumas implementações implementações para esta `interface`, porém iremos falar das seguintes implementações: |
| 6 | + |
| 7 | +- [HashSet](https://docs.oracle.com/javase/8/docs/api/java/util/HashSet.html) |
| 8 | + - Esta implementação é a mais rápida dentre elas, ela armazena os valores em uma [Hash Table](https://en.wikipedia.org/wiki/Hash_table#:~:text=In%20computing%2C%20a%20hash%20table,desired%20value%20can%20be%20found.), esta implementação não garante a ordem dos elementos adicionados nela. |
| 9 | +- [LinkedHashSet](https://docs.oracle.com/javase/8/docs/api/java/util/LinkedHashSet.html) |
| 10 | + - Esta implementação é parecida com a do `HashSet` porém por trás dos panos ela utiliza uma [LinkedList](./07-LinkedList-vs-ArrayList.md) em sua implementação ao invés de um [HashMap](https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/HashMap.html) que sera explicado nos próximos capítulos. |
| 11 | +- [TreeSet](https://docs.oracle.com/javase/8/docs/api/java/util/TreeSet.html) |
| 12 | + - Esta implementação utiliza uma [Red Black Tree](https://en.wikipedia.org/wiki/Red%E2%80%93black_tree), esta implementação garante a ordem dos elementos que forem inseridos no Set. |
| 13 | + |
| 14 | +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. |
| 15 | + |
| 16 | +## <center>Trabalhando com o Set</center> |
| 17 | + |
| 18 | +Iremos realizar as demonstrações utilizando o `HashSet`, porém o modo de trabalho das outras duas implementações mencionadas neste capitulo. |
| 19 | + |
| 20 | +### <center> HashSet e LinkedHashSet</center> |
| 21 | + |
| 22 | +O calculo do [Hash](https://en.wikipedia.org/wiki/Hash_function) 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. |
| 23 | + |
| 24 | +Instanciando um HashSet: |
| 25 | + |
| 26 | +```java |
| 27 | +public class App { |
| 28 | + public static void main(String[] args) { |
| 29 | + Set<Integer> intSet = new HashSet<>(); |
| 30 | + } |
| 31 | +} |
| 32 | +``` |
| 33 | + |
| 34 | +A instanciação do HashSet é simples, basicamente temos o padrão `Set<Tipo> nome = new HashSet<>();` com isso já temos a instancia para trabalharmos. |
| 35 | + |
| 36 | +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. |
| 37 | + |
| 38 | +```java |
| 39 | +public class App { |
| 40 | + public static void main(String[] args) { |
| 41 | + Set<Integer> intSet = new HashSet<>(); |
| 42 | + intSet.add(10); |
| 43 | + intSet.add(20); |
| 44 | + if(intSet.add(10)) { |
| 45 | + System.out.println("O numero '10' já existe"); |
| 46 | + } |
| 47 | + } |
| 48 | +} |
| 49 | +``` |
| 50 | +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. |
| 51 | + |
| 52 | +```java |
| 53 | +public class App { |
| 54 | + public static void main(String[] args) { |
| 55 | + Set<Integer> intSet = new HashSet<>(); |
| 56 | + intSet.add(10) |
| 57 | + intSet.add(20); |
| 58 | + if(intSet.remove(10)) { |
| 59 | + System.out.println("O numero existe no Set e foi removido"); |
| 60 | + } |
| 61 | + } |
| 62 | +} |
| 63 | +``` |
| 64 | + |
| 65 | +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. |
| 66 | + |
| 67 | +```java |
| 68 | +public class App { |
| 69 | + public static void main(String[] args) { |
| 70 | + Set<Integer> intSet = new HashSet<>(); |
| 71 | + intSet.add(10) |
| 72 | + intSet.add(20); |
| 73 | + if (intSet.isEmpty()) { |
| 74 | + System.out.println("Esta vazio!"); |
| 75 | + } else { |
| 76 | + System.out.println("Não esta vazio!"); |
| 77 | + } |
| 78 | + intSet.clear(); |
| 79 | + System.out.println("O tamanho do Set é: " + intSet.size()); |
| 80 | + } |
| 81 | +} |
| 82 | +``` |
| 83 | + |
| 84 | +### <center> TreeSet</center> |
| 85 | + |
| 86 | +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](https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/Comparable.html) ou [compare](https://docs.oracle.com/javase/8/docs/api/java/util/Comparator.html) 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. |
| 87 | + |
| 88 | +### Imutabilidade |
| 89 | + |
| 90 | +Assim como já discutido no [capítulo anterior](./08-Listas-imutaveis.md) 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. |
0 commit comments