# Conceitos importantes em Java
## Date
### - *Simple Date Format*
* Define formatos para conversão entre Date e String.
* dd/MM/yyyy -> 04/08/2022
* dd/MM/yyyy HH:mm:ss -> 04/08/2022 22:13:25
### - *Calendar*
* Classe abstrata (não pode ser instanciada) utilizada para manipulação de datas. Devido ao fato de não ser instanciável, devemos utilizar o método estático *getInstance()*.


---
## Exception
### - Estrutura *try-catch-finally*
* Bloco try: parte do código onde pode ocasionar uma *exception*.
* Bloco catch: contém a parte que será executada caso capture a *exception*.
* Bloco finally: esse bloco é executado independente de ter ocorrido um exceção ou não.

---
## Files
### - Leitura de arquivos
* Utilizando BufferedReader e FileReader com um bloco try-with-resources:

---
## Generics
* Generics permitem que classes, interfaces e métodos possam ser parametrizados por tipo.
* Uso comum: coleções.
## Set
* **Não admite repetições.**
* **Elementos não possuem índices.****Elementos não possuem índices.**
* Acesso, remoção e inserção de elementos são rápidos.
* Oferece operações de conjunto: intersecção, união, diferença.
* Principais implementações:
- **HashSet**: mais rápido e não ordenado.
- **TreeSet**: mais lento e ordenado pelo compareTo do objeto ou por Comparator.
- **LinkedHashSet**: velocidade intermediária e elementos na ordem em que são adicionados.
* Alguns métodos importantes:
- add(), remove(), contains() => baseados em equals e hashCode (se não existirem é feita a comparação de ponteiros).
- size().
- removeIf(Predicate).
- addAll(outro Set) => união.
- retainAll (outro Set) => intersecção.
- removeAll (outro Set) => diferença.
---
## Map
* Map é uma coleção **baseada em par chave/valor**.
* **Não admite repetição de chave**.
* Os elementos são indexados pela chave, mas não possuem posição.
* Acesso, inserção e remoção de elementos são rápidos.
* **Uso comum: Cookies**.
* Principais implementações:
- **HashMap**: mais rápido e não ordenado.
- **TreeMap**: mais lento e ordenado pelo compareTo do objeto ou por Comparator.
- **LinkedHashMap**: velocidade intermediária e elementos na ordem que foram inseridos.
* Alguns métodos importantes:
- put(key, value), remove(key), containsKey(key), get(key) => baseados em hashCode e equals. Se não existirem, é feito a comparação de ponteiros.
- clear(), size().
- keySet() => retorna um Set apenas com as chaves.


- values() => retorna uma coleção com os valores do Map.


## Programação funcional e Expressões Lambda