Como usar melhor a API Java Collection
Tags: java, beginners, programming
Published: 2023-01-04 12:03:00

## Introdução

Como desenvolvedor Java, sempre tive uma alta demanda de estudos práticos e isso acabou me gerando diversas dúvidas ao longo da minha carreira.

Então, após finalizar minha faculdade de Engenharia da Computação, desejei voltar desde os fundamentos e estudar, me aprofundando em cada ponto da linguagem de programação Java, respondendo dúvidas comuns que ficavam em minha cabeça.

Nesse artigo irei explicar o que é o Java Collection, já dando spoiler, também irei explicar qual o motivo de usar essa API incrível do Java e quando usar cada uma das principais estruturas de dados que ela trata através de suas incríveis interfaces.

---

## O que é a Java Collection?

É uma API Java, que fornece a nós desenvolvedores, um conjunto de classes e interfaces para armazenarmos, acessarmos e manipularmos um conjunto dinâmico de objetos (precisa ser objetos, os métodos não aceitam tipos primitivos, então caso precise de uma lista de inteiros, por exemplo, você irá utilizar **Integer** e não **int**).

Dessa forma tratamos esse conjunto de dados como uma coleção, que por sinal é o nome da interface base da API, o Collection. Essa API possui uma enorme gama de interfaces interligadas com métodos para realizar as operações já citadas.

---

## Por que usar?

A resposta é bem simples, temos vários motivos, os mais essenciais no meu ponto de vista, são:

- Reuso das Interfaces disponíveis;

- Entendimento do código, já que na maioria esmagadora dos casos, implementamos o Java Collection em nossa aplicação, sendo muito mais simples e fácil de entender seu uso como sua performance, ao invés de algoritmos escritos de forma própria;

- Boa qualidade, pois como havia dito, é extremamente utilizada em projetos, então foi submetida a muitos testes;

---

## Hierarquia da API

Na API possuímos uma grande quantidade de interfaces e classes feitas para disponibilizar métodos e gerenciamento através de objetos, temos vários casos de colecionamento de objetos.

Como mostra a hierarquia abaixo:

![Diagrama mostrando a hierarquia do Java Collection API](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/y31ww8qjpgr1wk1f293c.jpg)

No caso do Map, mesmo que ele não esteja na Coleção em si, ele pertence a esse pacote de utils do Java e pode ser usado da mesma forma.

Através dessas interfaces, podemos criar listas (list), conjuntos (set), mapas (map), filas (queue), Stack (pilha) e etc.

## Quais são as interfaces mais comuns?

### List

Visão geral sobre essa interface, que é a mais utilizada da API:

- Objetos ordenados;

- Pode conter elementos duplicados;

- Indexado, podemos ter controle sobre o local do elemento;

- Muito parecido com o Array comum, mas ele é dinâmico;

- As classes mais utilizadas em implementação é o ArrayList e o LinkedList;


![Ilustração do list](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ndg9xerg87ve0fmyfgax.png)

Em que momento utilizar essa interface:

- Quando precisaremos fazer acessos aleatórios, já que ela é indexada;

- Caso exista a chance de ter elementos duplicados na sua coleção;

ArrayList VS LinkedList:

**ArrayList**

- Precisa fazer consultas mais vezes pelo índice;

- Não precisa de inserções e remoções constantes.

**LinkedList**

- Consultas frequentes pelo início e fim da coleção;

- Precisa fazer inserções e remoções constantes;

- Lista com um tamanho significante.

Exemplo de chamada:

**ArrayList**

![Instancia de uma List com ArrayList](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/l1jeylqaascd06frknwx.png)

**LinkedList**


![Instancia de uma List com LinkedList](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/tilg0qn0h4r395d7nqy6.png)

### Set

Visão geral sobre a interface Set:

- Não permite elementos duplicados, elementos únicos;

- Trabalha com representações de conjuntos matemáticos;

- Não é indexada;


![Set imagem](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/v9npimybo0q9ppcesav5.png)

Utilizamos essa interface, quando precisamos montar uma coleção sem elementos duplicados:

- Quando possui um sistema que cadastrará usuários únicos no sistema.

- Para armazenamento de números únicos em algoritmos.

Suas implementações são:

- HashSet: Elementos únicos, mas sem ordenação, consulta rápida;

- TreeSet: Elementos classificados em ordem natural, consulta um pouco mais lenta que o HashSet;

- LinkedHashSet: Mantém uma lista duplamente ligada através de seus itens. Seus elementos são integrados na ordem em que foram inseridos. Como por exemplo uma corrida de fórmula 1, onde temos que armazenar as colocações;

Exemplo de chamada

**HashSet**

![Instancia de um Set com HashSet](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/d2nd505veh35qd0hpq58.png)

**TreeSet**

![Instancia de um Set com TreeSet](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/hjxn2jeupfvubrm9wzp6.png)

**LinkedHashSet**

![Instancia de um Set com LinkedHashSet](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/a501tle4zck6xxn7buwf.png)

### Map

Visão geral sobre a interface Map:

- Mapeamento chave-valor;

- Não pode repetir mesma chave, mas podemos ter chaves diferentes com o mesmo valor;

![img de ex map](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/a3i7xmgv4x5j8mrga463.png)

Utilizamos o Map quando precisamos da interação de chave-valor, como na classe Properties, ou até mesmo quando queremos montar os query params de uma chamada e precisamos passar o nome da variável e o valor dela.

![img de ex map](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/btyqw3lplzczje5ku6fi.png)

Suas implementações

- HashMap: Permite chaves e valores null, não possui garantia de ordenação;

- TreeMap: Garantia de ordenação em ordem crescente pela chave, mas pode ser alterado, usado quando queremos nosso map ordenado;

Exemplos de chamada:

**HashMap**

![Map com HashMap](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/xxfv3c5li0kd2x5yhvlp.png)

**TreeMap**

![Map com TreeMap](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/hq2khubcwwzuxxgb1wp7.png)

---

## Conclusão

Espero que tenha ficado claro em que momento usar cada uma das interfaces e suas implementações, é extremamente importante entender as ferramentas que temos disponíveis em nossas mãos, para criar um código de qualidade e logicamente mais efetivo.

Estarei disponibilizando uma tabela resumida sobre o assunto explicado:

![diagrama uso de collection basico](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/un19bu7fjrkc0r28p6iy.jpeg)

Também meu repositório com exemplos dos métodos das implementações citadas. [Link do git](https://github.com/matskira/mpoda-java-collection
)
Caso queira se aprofundar mais, nada melhor que a documentação oficial: [Documentação Oracle](https://docs.oracle.com/javase/tutorial/collections/implementations/index.html)

Obrigado por terem ficado até aqui, e lembre-se que a jornada é uma montanha, é difícil subir, mas quando se está no topo, a vista é incrível.

Até a próxima.

Referências:

https://www.digitalocean.com/community/tutorials/collections-in-java-tutorial https://www.javatpoint.com/collections-in-java https://www.devmedia.com.br/java-collections-como-utilizar-collections/18450 https://www.quora.com/What-are-the-most-important-Java-collections-to-use https://stackoverflow.com/questions/21974361/which-java-collection-should-i-use