JayCesar / generation-bootcamp

[💻 Bootcamp ] Um programa de estudos de 3 meses da Generation Brasil, sendo cada qual destinado a diferentes tecnologias.
4 stars 0 forks source link

Collections #10

Closed JayCesar closed 1 year ago

JayCesar commented 1 year ago

📌 Collections (My Summary)

Link para o cookbook: Repositório


Quando a gente utiliza o array precisamos definir um tamanho para ele na instanciação. Isso é uma limitação que pode causar alguns problemas para desenvolvedores, pois quando há a necessidade de trabalhar com grandes volumes de dados, torna-se muito difícil mensurar o número de objetos que iremos armazenar. Para suportar estruturas de dados mais fexíveis - sem tamanho pré-definido - o Java fornece a Classe Coleection (coleção);

Uma coleção é uma Estrutura de Dados que contém e processa um conjunto de dados. Para eu conseguir acessar essas dados amazenados e encapsulados eu preciso utilizar métodos pré-definidos.

Exemplo: Uma pessoa desenvolvedora pode adicionar elementos a uma coleção por meio de um étodo.

⚠️ As coleções utilizam matrizes para o armazenamento, mas elas ocultam da pessoa desenvolvedora a complexidade de gerenciar o tamanho da Matriz de forma dinâmica.

As Coleções oferecem diversas formas de armazenar os dados com base em fatores como:

📌 Collections

Collections é uma biblioteca de classes e interfaces 'um combo) dentro do pacote **java.util.*. Essa blitioteca Collection implementa as PRINCIPAIS ESTRUTURAS DE DADOS** de forma reutilizável (usando apenas duas inferfaces comuns).

Ela oferece também implementações de cursor para iteração (iterator), para extrair os dados de qualquer estrutura usando uma única interface e implementações de métodos estáticos utilitários para manipulação de coleções e vetores.

CONTÚDO, as Collections não suportam dados primitivos (int, float, double, enttre outros); somente se forem encapsulados dentro de Objetos ou se forem utilizadas as Classes Wrappers para converter os primitivos em Objetos:

Classes Wrappers

Tipo Primitivo Tamanho Wrapper
boolean true ou false Boolean
char 16 bits Character
byte 08 bits Byte
short 16 bits Short
int 32 bits Integer
long 64 bits Long
float 32 bits Float
double 64 bits Double
String Não é um tipo primitivo

Wrapper: Vem do verbo inglês “wrap” que significa envolver. São Classes que adicionam funcionalidades aos tipos primitivos. A Classe Wrapper transforma um primitivo em Objeto e adiciona Métodos.

Double MarkII = new Double(0.0); // Esse jeito é obsoleto;

Nos Organogramas abaixo, temos uma visão geral das Classes e Interfaces, que compõem o Pacote Collections:

Interface é uma estrutura que representa uma Clase abstrata "pura" em java, que não possui aributos de dados, não possui um método construtor, todos os seus Métodos são abstratos e não é declarada como Classe e sim como interface. É como se fosse um 'contrato a ser assinado'.

image

Uma List seria como uma sequência de blocos numerados (índices), fazendo um analogia com Blocos de montar: image

A implementação ArryList é bem masi eficiente do que a implementação Vector (Embora sejam semelhantes).

A Implementação LinkedList ou Lista Vinculada é uma estrutura de dados linear, na qual os elementos não são armazenados em locais de memória contíguos (sequenciais). Os elementos em uma lista vinculada são vinculados usando ponteiros internamente, que "apontam" para o endereço de Memória do próximo item (SimpleLinkedList - Lista Vinculada simples) ou para o endereço de Memória do próximo item e do item anterior (DoubleLinkedList - Lista Duplamente Vinculada).

Os Ponteiros são variáveis especiais que apontam para uma área de memória. Os ponteiros não possuem a informações em si, mas dizem onde a informação está armazenada na Memória. Na Linguagem Java, os Ponteiros atuam internamente na Linguagem Java e não ficam visíveis para as Pessoas Desenvolvedoras, como na Linguagem C, por exemplo.

Fazendo uma analogia com Blocos de montar, uma LinkedList seria como uma sequência de blocos que possuem conexões (links) com o próximo bloco (encadeada) e com o bloco anterior (duplamente encadeada), como mostra a imagem abaixo:

image

A Implementação Stack, implementa a estrutura de dados chamada Pilha. Uma Pilha é uma estrutura de dados do tipo LIFO: "O último elemento inserido na pilha é o primeiro elemento que será retirado da pilha." (Last In - First Out).

Fazendo uma analogia com Blocos de montar, uma Stack seria como uma pilha de blocos, um em cima do outro, como mostra a imagem abaixo:

image

A interface Queue (Fila) é uma extensão (herança) da Interface Collection. Queue é a implementação da Estrutura de Dados conhecida como fila, onde "O primeiro elemento adicionado, será primeiro elemento a ser retirado da fila" (FIFO - First in, First out).

Fazendo uma analogia com Blocos de montar, uma Fila seria como uma sequência de blocos, como mostra a imagem abaixo:

image


Tip: A Estrutura de dados fila pode ser representada no mundo real como uma fila de pessoas em um balcão, onde a pessoa que entra primeiro será atendida primeiro e log sai da fila primeiro.

JayCesar commented 1 year ago

Interface Set

A interface Set é uma extensão (herança) da Interface Collection. O Conjunto é uma estrutura que modela a definição matemática de um conjunto de dados. É uma coleção de objetos, que não permite objetos duplicados. O conjunto permite no máximo um elemento nulo.

Fazendo uma analogia com Blocos de montar, um Set seria como uma coleção de blocos, ou seja, um conjunto, sem elementos repetidos, não ordenados, como mostra a imagem abaixo:

image

A implementação HashSet é a mais rápida de todas, porque ela utiliza internamente uma HashTable e seus elementos não são ordenados. Essa implementação é indicada se você precisa apenas garantir a alta performance sem se importar com a ordem com que os elementos estão ordenados

JayCesar commented 1 year ago

Iterator

A interface Iterable é a raiz de toda a hierarquia - a clase 'mãe' de toda a hierarquia de coleção. Isso significa que cada classe e interface a implementa. A função principal do iterator é permitir que o usuário percorra todos os objetos de qualquer uma das Collections, presentes no Pacote Collections, como se fossem sequências simples de itens de dados.

Sintaxe:

Iterator<T> nomeDoIterator = nomeDaCollection.iterator();

O item em Java, representa um Java Type Generic. Ele é utilizado para definir o tipo de Objeto que será armazenado na Collection. O Tipo de dados obrigatoriamente deve ser um Objeto, que pode ser de uma Classe Wrapper ou de uma Classe criada pela pessoa desenvolvedora.

Principais Métodos da Interface Iterator

Método Descrição
hasNext() Retorna verdadeiro se a iteração tiver mais elementos.
next() Retorna o próximo elemento na iteração. Ele lança a Exceção NoSuchElementException se nenhum outro elemento estiver presente.

Quais são as vantagens e desvantagens de se utilizar a Interface Iterator?

As principais vantagens da Interface Iterator são:

Podemos utilizar esta Interface com qualquer Collection;

As principais limitações da Interface Iterator são:

DICA: Para efetuar iteração paralela, utilizamos outra Interface, chamada de SplitIterator, que divide a Collection em partes menores e percorre estas partes simultaneamente.

JayCesar commented 1 year ago

A Collection ArrayList

A Collection ArrayList é a escolha natural quando for necessário usar um vetor redimensionável, que é muito mais eficiente para leitura, por ser implementado internamente com vetores, o que a torna ideal para o acesso aleatório aos dados armazenados.

Principais Métodos da Interface List

Método Descrição
add(Objeto) Adiciona um objeto no final da lista.
add(Indice,Objeto) Adiciona um objeto na posição indicada (empurra elementos existentes para a frente)
get(Indice) Recupera um objeto pelo índice.
indexOf(Objeto) Procura um objeto e retorna índice da primeira ocorrência do objeto.
set(Indice,Objeto) Grava um objeto na posição indicada (apaga qualquer outro que ocupava a posição).
remove(Indice) Apaga o objeto armazenado na posição indicada pelo índice.
clear() Limpa a lista
size() Retorna o tamanho da lista (numero de elementos armazenados).
isEmpty() Retorna true se a lista está vazia.
contains(Objeto) Retorna true se existe uma ocorrência do elemento na lista.
sort(null) Ordena os elementos da lista em ordem crescente.
sort(Comparator.reverseOrder()) Ordena os elementos da lista em ordem decrescente.
JayCesar commented 1 year ago

A Collection Set

Set é uma coleção não ordenada de objetos, que não permite o armazenamento de valores duplicados, ou seja, ela permite apenas valores únicos. Essa interface contém os métodos herdados da Interface Collection e adiciona um recurso que restringe a inserção dos elementos duplicados. Esta classe também permite a inserção de um único elemento nulo (NULL), embora não seja recomendado.

Os objetos que inserimos na Collection Set não serão necessariamente inseridos na mesma ordem e inclusive esta ordem não é constante ao longo do tempo. A Collection Set não possui um Método para obter um Objeto a partir do seu índice, como vimos na Collection List.

Os objetos são inseridos na Collection Set com base em seu Hashcode. O Hashcode é um número inteiro com 7 dígitos, calculado a partir do Método Hashcode(). A partir do Hashcode do Objeto, obtido pelo Método hashcode(), a Collection Set determina a posição onde o Objeto será armazenado no Hashmap. Por se tratar de um número calculado, a posição do elemento será aleatória.

O HashSet usa internamente o HashMap para armazenar seus elementos. Sempre que você cria um objeto HashSet, um objeto HashMap associado a ele também é criado. Este objeto HashMap é usado para armazenar os elementos inseridos no HashSet. Os elementos adicionados ao HashSet são armazenados como chaves desse objeto HashMap. O valor associado a essas chaves será uma constante (PRESENT).

image

Sintaxe:

Set<T> setNumeros = new HashSet<T>();

Métodos da Collection Set

Método Descrição
add(Objeto) Adiciona um Objeto na Collection Set.
remove(Objeto) Apaga o Objeto armazenado na Collection Set.
clear() Limpa a Collection Set
size() Retorna o tamanho da Collection Set (numero de elementos armazenados).
isEmpty() Retorna true se a Collection Set está vazia.
contains(Objeto) Retorna true se o Objeto existe na Collection Set.
hashcode() Retorna o Hashcode do elemento.
JayCesar commented 1 year ago

🔑Pontos chave:

Collections (coleções) em Java são tipos especiais de classes utilizadas para manipular grupos de dados do mesmo tipo (por exemplo, coleção de strings), com tamanho flexível.