Skip to content

Commit 5f5113c

Browse files
authored
Merge pull request #21 from pgjbz/feature/set
Sets
2 parents 4dde2d5 + aca803b commit 5f5113c

File tree

3 files changed

+94
-1
lines changed

3 files changed

+94
-1
lines changed

4 - Intermediário/08-Listas-imutaveis.md

+3-1
Original file line numberDiff line numberDiff line change
@@ -142,4 +142,6 @@ public class App {
142142

143143
}
144144
}
145-
```
145+
```
146+
147+
[Próximo](./09-Sets.md) - Sets

4 - Intermediário/09-Sets.md

+90
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
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.

README.md

+1
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@
5656
6. 🔠 [Collections e Stream API](/4%20-%20Intermedi%C3%A1rio/06-Collections-e-Stream.md)
5757
7. 🔠 [LinkedList vs ArrayList](/4%20-%20Intermedi%C3%A1rio/07-LinkedList-vs-ArrayList.md)
5858
8. 🔠 [Listas Imutáveis](/4%20-%20Intermedi%C3%A1rio/08-Listas-imutaveis.md)
59+
9. 🔠 [Sets](/4%20-%20Intermedi%C3%A1rio/09-Sets.md)
5960

6061
### Extras
6162

0 commit comments

Comments
 (0)