Article image
Caio Oliveira
Caio Oliveira02/05/2023 09:34
Compartilhe

Um breve papo sobre Coleções (Pt. 1) - Collections e a Interface List

  • #Java

Essas anotações são fruto de minhas aulas particulares de Java, espero que sejam de grande ajuda (Caso gostem, deixem comentários e colocarei o conteúdo restante, explicando sobre Queue, Set e Map)

O que é uma Collection?

  • É um objeto que agrupa multiplos elementos dentro dele.
  • Ela armazena e processa um conjunto de dados de forma eficiente.
  • Diferente da Array Java, ela não exige que instanciemos o tamanho dela na inicialização, fazendo isso dinâmicamente.

O Java lida com collections através de um Framework chamado Collections!

O que é um framework?

É um conjunto de soluções prontas para facilitar a vida do desenvolvedor.

O que é o framework Collections?

O framework Collections do Java é uma biblioteca de classes e interfaces que fornece uma implementação de alto desempenho de estruturas de dados como listas, conjuntos e mapas. Vale ressaltar que ela passou a ser implementada a partir do Java 2.

Esse framework nos fornece 3 tipos de objeto:

  • List
  • Queue 
  • Set
  • Map

* Vale ressaltar que o Map, que apesar de não fazer parte do framework, compartilha de algumas características, as quais iremos conversar sobre futuramente.

Como funcionam a Bilioteca Collections em Java?

 - Trabalha com interfaces entre os tipos (List, Map, Set, Queue)

 - Cada uma dessas interfaces, tem suas implementações.

- Não trabalha com tipos primitivos!! (Apenas objetos)

 

Vamos falar agora sobre a interface List!

O que caracteriza a interface List?

  • Não garante a unicidade dos elementos!
  • Garante ordem de inserção (Guarda a posição dos elementos)

Iremos abordar as duas principais implementações da interface List: ArrayList e a LinkedList. As outras implementações, conversaremos quando falarmos sobre paralelismo.

Principais diferenças entre ArrayList x LinkedList

ESTRUTURA DE DADOS

  • ArrayList é implementado como um array redimensionável, enquanto LinkedList é implementado como uma lista duplamente ligada.

INSERÇÃO E REMOÇÃO DE ELEMENTOS

Ilustrando: Suponha que desejamos colocar o elemento X na posição [2] da nossa lista com 4 Elementos

ArrayList:

 [1]-----> (guardado)

O-O-O-O ->  [O]  -> O-X -> 0-X-0-0-0

LinkedList:

   [1]

O-O-O-O -> 0-X-0-0-0

  • LinkedList é mais eficiente para inserção e remoção de elementos no meio da lista, porque não requer realocação de memória como o ArrayList, que precisa realocar e copiar todos os elementos que estão à direita do elemento sendo inserido ou removido. Em contraste, ArrayList é mais eficiente para adicionar ou remover elementos no final da lista, pois não há necessidade de realocação de memória.

USO DE MEMÓRIA

  • ArrayList usa uma quantidade constante de memória para armazenar seus elementos, mesmo que a lista não esteja completamente preenchida, enquanto LinkedList usa uma quantidade variável de memória, dependendo do número de elementos na lista.

Como saber qual escolher?

  • ArrayList: Se você precisar de acesso rápido a elementos em uma lista e não precisa de muitas operações de inserção/remoção no meio da lista.
  • LinkedList: Se você precisar de muitas operações de inserção/remoção no meio da lista e não se importar com o acesso lento aos elementos.

* Na minha experiência como programador, sempre usei ArrayList kkk

Como inilicizar uma List?

Para falarmos um pouco sobre isso, devemos falar um pouco sobre a funcionalidade Generics.

Mas Caio? Que diabos é esse negócio de Genercis??

Generics são uma funcionalidade do Java que permite que Classes e Interfaces sejam parametrizadas com outros tipos de Dados. Em outras palvras, com generics, você pode definir classes e interfaces mais flexíveis para trabalhar com diferentes tipos de objetos, permitindo uma melhor reutilização de código.

Vamos testar isso na prática? (Depois de um amontoado de de conceitos, nada melhor que programar um pouco né? kkkk)

public class MinhaClasse<K> {

 private K meuObjeto;
 public void setObjeto(K objeto) {this.meuObjeto = objeto;}
 public K getObjeto() {return meuObjeto;}

}

O K contido entre <> em java é oque chamamos de WildCard, ele serve como um Coringa para o tipo que desejamos passar para o argumento da classe. Vamos agora testar o funcionamento disso na classe main

public class Main {

  public static void main(String[] args) {
      MinhaClasse minhaClasse = new MinhaClasse();
      Pessoa pessoa = new Pessoa("Caio",32);
      minhaClasse.setObjeto(pessoa);
      System.out.println(minhaClasse.getObjeto());
      Veiculo veiculo = new Veiculo("Carro",4);
      minhaClasse.setObjeto(veiculo);
      System.out.println(minhaClasse.getObjeto());
  }
}

Podemos obrigar a MinhaClasse a aceitar apenas um tipo de objeto, através da seguinte declaração de instanciamento:

Ex:

MinhaClasse<TipoDeObjeto> obj = new MinhaClasse<>();

As Listas utilizam a ideia de Generics em suas implementações atuais a partir da versão 7 do Java, para declarar uma List devemos seguir a seguinte Sintaxe:

List<TipoElementoDaLista> nomeDaLista = new (ClasseDaImplementaçãoDaLista)<>();

Ex:

List<TipoElementoDaLista> nomeDaLista = new ArrayList<>();
List<TipoElementoDaLista> nomeDaLista = new LinkedList<>();

Podemos também instanciar uma Lista valores através do Arrays.asList, isso gera uma lista imutavel! Mas podemos passar essa lista como argumento de uma implementação da interface List.

List<TipoElementoDaLista> nomeDaLista = new (ClasseDaLista)<>(Arrays.asList(...));
List<TipoElementoDaLista> nomeDaLista = Arrays.asList(...);

Vale ressaltar, que essa ultima não nos permite fazer alterações na lista. Permitindo apenas percorrer por ela.

Exemplo: Crie uma ArrayList com os números 10,11,22,34

List<Integer> minhaArrayList = new ArrayList<>(Arrays.asList(10,11,22,34));

Principais métodos da Interface List

  • add(E e): Adiciona um Elemento na lista. T

Tipo de retorno: Tipo do Elemento da Lista

  • remove(Objeto o): Remove a primeira ocorrência do elemento especificado da lista, se estiver presente.

Tipo de retorno: boolean

  • get(int índice): Retorna o elemento na posição especificada na lista.

Tipo de retorno: Tipo do Elemento da Lista

  • set(int posição, e elemento) : Substitui o elemento na posição especificada.

Tipo de retorno: Tipo do Elemento da Lista

  • size(): Retorna o número de elementos da lista

Tipo de retorno: int

  • isEmpty(): Retorna true se a lista for vazia, e false caso não esteja.

Tipo de retorno: boolean

  • contains(Objeto o): Retorna true se tiver o elemento, e false caso contrário

Tipo de retorno: boolean

  • indexOf(Object o): Retorna a posição da PRIMEIRA ocorrência do elemento especificado na lista, ou -1 se a lista não tiver o elemento

Tipo de retorno: int

  • lastIndexOf(Object o): Retorna a posição da ÚLTIMA ocorrência do elemento especificado na lista, ou -1 se a lista não tiver o elemento

Tipo de retorno: int

  • clear(): Remove TODOS os elementos da lista

Tipo de retorno: void

That's all folks!

Compartilhe
Comentários (1)
Gilson Filho
Gilson Filho - 03/05/2023 13:15

Bom dia, Caio!


Além de muito bem escrito, seu artigo caiu como uma luva... pois estou justamente estudando esse assunto agora e já ajudou bastante.


Obrigado!