Básico efetivo sobre Coleções e Mapas com Java
Tags: java, arraylist, beginners, collections
Published: 2022-03-09 19:12:25


## **Básico efetivo sobre Coleções e Mapas com Java**

![Árvore, coleções e Mapas Java](https://cdn-images-1.medium.com/max/2560/1*kJuPMlHtla1OQ4kFAi-2Lw.png)

Durante meu início como Dev Java me vi em situações onde precisei parar, voltar novamente a estudar para entender qual tipo de coleção Java usar, ou mesmo analisando códigos já feitos por outros devs, eu me perguntava por que usar um **Map** aqui? Ou **LinkedList** ali? doidera… rsrsr 🥺

Para completar, andei fazendo umas entrevistas e recebi perguntas bastante interessantes acerca do assunto de coleções em Java. Vamos falar sobre aqui…

**Vem comigo, vamos descer essa ladeira. rsrsrs (*sem freio*)🤣**

![](https://cdn-images-1.medium.com/max/2000/0*2PavT1qQPHsjGMLP)

**Vamos começar a entender a Diferença entre List, Set e Map.**

**List** essa interface que é uma subinterface da interface de *Collection* (aaa não confunda [Collection](https://docs.oracle.com/javase/8/docs/api/java/util/Collection.html) com [Collections](https://docs.oracle.com/javase/7/docs/api/java/util/Collections.html)**) tem 3 implementações **(ArrayList, Vector, LinkedList)**.

**Bom vamos lá.** Seus métodos são baseados em índice para as principais operações, buscar, inserir, atualizar e excluir elementos, **suave até aqui…**

**Mais algumas características do List.**

Importante, essa interface mantém a ordem de inserção, ou seja, da forma que foi inserido será mostrado, não tem ordenação, (do jeito que entra sai rsrs), mas isso pode ser feito com a classe *Collections* que tem alguns métodos estáticos prontos, entre eles o método “sort”

**A busca de um elemento é rápida** no **List**, por ex: usando o **ArrayList**, mas se precisar fazer grandes volumes de inserções e exclusões nesse caso essa interface não é a melhor opção, pois nesses dois últimos pontos perde em performance, (*tem umas sacadas que podem ser feitas para melhorar essa performance), mas* por hora vamos entender que essa implementação não é a melhor para essa finalidade.

**Outra sacada** é que nessa interface as inserções, exclusões são em linha, **ou seja**, lineares, o tempo cresce com o aumento da estrutura da lista, (bugou? rsrs😅), calma na alma, vou te explicar…

Resumindo conforme a lista vai aumentando, o tempo que o código que manipula essa lista gasta para operações de exclusão por ex, aumenta.

**“A mais para que isso é importante saber?** Pensa comigo com esse entendimento você saberá definir, (ou pelo menos já terá uma ideia) se em determinado contexto é interessante usar a interface **List** e uma de suas implementações ou outro tipo de coleção com Java, ou mesmo pode ser quando uma tarefa chegue para você ou em uma entrevista para uma vaga, inclusive eu recebi uma pergunta bem interessante quanto a utilização de **ArrayList** em uma entrevista para uma empresa internacional, dá, [uma olhada nesse artigo, aqui falo sobre isso no ](https://gab-arteinfo.medium.com/perguntas-de-entrevistas-para-desenvolvedor-java-j%C3%BAnior-57a29192aa8b?source=your_stories_page----------------------------------------)final, *inclusive está nele a “sacada da sacada” referente a performance que citei acima). rsrsrs 🥳*

![](https://cdn-images-1.medium.com/max/2000/0*vXwgSJaXMBfqItg4)

**Uso recomendado do List**

A interface **List** é top quando o contexto em questão necessita fazer acesso rápido aos elementos dessa lista.

Um exemplo, **deixa eu pensar…** pensei… Tipo assim, uma implementação que você precise criar uma vitrine, catálogo ou algo assim, com algum objeto, sei lá, filmes ou livros, e cada **elemento** inserido receba um número identificador(ID) sequencial, esse número será usado para acessar esses elementos partindo do início, que como sabemos é zero, nesse caso o uso do **ArrayList** é excelente, pois os seus métodos são baseados em índice e isso facilita muito na procura. Manja? rsrsr✌️

**Set,** diferentemente do **List,** a interface **Set** não permite elementos duplicados. As suas implementações são(**HashSet**, **LinkedHashSet**, **TreeSet**) tem também a interface **SortedSet**, que estende **Set**, essa tem a função de fornecer método para a classificação natural dos elementos, como, por exemplo: ordem alfabética.

**Mais algumas características da interface Set.**

Vou falar da implementação mais usada dessa interface que a **HashSet,** usada em contextos onde não se pode ter elementos duplicados na lista, é não mantêm a ordem em que os elementos foram inseridos

**Não tem método get() para recuperar elementos a partir de índice.**

Uma coisa que não citei referente ao **ArrayList** da interface **List**, essa fornece método **get()** para chegarmos em um elemento a partir do índice, tipo get(1) mas o **Set** não.

**Uso recomendado do Set**

Essa coleção é boa em contextos onde a implementação define que os elementos devem ser únicos, aaaa e a ordem não for relevante. Já usei algumas vezes em situações onde eu precisei limpar duplicados de uma lista que já havia sido instanciada com **ArrayList, então adiciono todos os elementos a nova lista **Set** com o método **addAll()**, na sequência limpo a lista que foi gerada com **ArrayList,** usando o método **clear(),** na sequência adiciono novamente todos os elementos a essa lista, claro tem alguns “***poremzinhos***” 🥲 rsrsrs, mas deixemos eles para outra hora. Sim, essa “*gambis” *que citei aí foi usando JDK´s abaixo do 8 tá? *Não me jogue pedra por favor rsrsr*

![](https://cdn-images-1.medium.com/max/2000/0*-GZEySb5Mek-dIB5)

**Map** é importante saber que os Mapas em Java não são considerados coleções, tanto que a interface map é designada como uma segunda árvore no hall das **Collection´s**, as suas classes e interface não provém de **Collection,** sua interface principal e Map mesmo rsrs, como as coleções que falamos acima, o map também tem suas implementações são: **HashMap ,[ ](https://acervolima.com/hashtable-em-java/)HashTable , TreeMap , ConcurrentHashMap e LinkedHashMap**, mas, vem comigo, vamos ver suas características principais e entender melhor.

**Vamos lá,** fato é que, mesmo os mapas em java não sendo considerados como coleções, ainda assim meio que são trabalhados como as coleções.

Sua principal característica é **mapear chaves para valores.** E tipo assim oh! Cada elemento que compõe esse mapa tem dois recursos(objetos), são eles, uma chave e um valor. Na declaração do mapa você precisa declarar via [generics](https://docs.oracle.com/javase/tutorial/java/generics/types.html) os tipos de parâmetros, sei lá, String(chave) String(valor), poderia ser quaisquer outros tipos ta? Dessa forma na hora de passar os argumentos para esse mapa você então vai declarar o argumento referente a chave e o argumento referente ao valor dessa chave, só não esquece que, valores podem até ser repetidos, mas chave de jeito nenhum, *never*.😖💩

Assim como a interface **Set, Map,** também não mantém a posição de inserção, ou seja, pode acontecer a inserção em uma posição, mas quando for mostrado, recuperado, aparecer em outra posição. Se você se ligou, essa característica do **Set** e **Map** difere do **List**. *Se ligou né?*

Essa interface também é baseada em [**tabela de espalhamento,](https://pt.stackoverflow.com/questions/129605/qual-melhor-forma-de-se-fazer-uma-tabela-de-espalhamento)** é permite chaves e valores null.

**Uso recomendado do Map**

O uso da interface Map é bom quando o seu contexto da aplicação indica que a ordenação não é importante com uma implementação que seja necessária registrar uma chave para cada valor específico Key(chave), agora se você decidir mudar uma implementação que já usava **Set** ou **List** para **Map,** pensa bem e veja o trampo que vai te custar, pois, os métodos dessas duas interfaces não poderão ser mais usados, pois o **Map** tem seus próprios métodos que diferem dos usados em coleções do tipo **Set** ou **List**. Certa vez precisei usar a interface **Map** em um contexto onde eu precisava passar para um [Web Client](https://blog.se.com/br/ecostruxure/2019/05/15/thin-clients-e-web-clients-qual-a-diferenca/) os dados de configuração de acesso a uma **Api**, estava usando ao Apache Http na época, então tinha que passar, token, usuário senha, e um outro código lá que esqueci agora, então passava(chave) user, (valor) dados do usuário, e assim por diante, um outro exemplo seria sei lá um código que precise buscar um aluno passando o nome, então a chave seria o nome, captou?

## **Não confunda a interface Collection com a classe Collections**

Quando eu vi na faculdade sobre **Collections** lembro que fiquei meio *bugado* sobre quem é quem, se você ficou também, vem comigo, esclarecer isso agora, primeiro **Collections** é uma classe utilitária usada para realizar algumas operações em uma **Collection, bugou mais ainda?** rsrsr E tipo assim, declarei um **ArrayList**, beleza, agora preciso ordenar a lista que criei em questão, iai? A interface **List** que estende de **Collection** não faz isso, aí que entra a **Collections,** ela tem o método “sort” usado para fazer ordenação em coleções em Java, tem muitos outros como, por exemplo, “shuffle” que bagunça tudo rsrsr(embaralha), “reverse” usado para trocar a ordem, tem também os irmãos “max” e “min” para encontrar valores maiores e menores, e etc, tem mais métodos ainda nessa classe utilitária, **sacou agora?** **Não?** Então pega esse resumo aqui embaixo.

Resumindo, **Collection** é tipo assim a mãezona de todas as coleções com Java, ela é a interface que as classes que a implementam tem que seguir.🤭

![](https://cdn-images-1.medium.com/max/2000/0*l5IyDHUX4BjFerWl)

## **Como saber qual interface usar na aplicação que estou fazendo ou aplicando manutenção com Java?**

Bom o primeiro passo você já deu que foi procurar entender melhor sobre as características de cada uma das interfaces de coleções e suas implementações, outra parada importante para se dar bem no uso de coleções com Java e entender sobre [hashcode() e equals()](https://blog.algaworks.com/entendendo-o-equals-e-hashcode/) e porquê? 😏

Bom, por exemplo, se for usar um **Set** da vida, tudo bem não permite duplicados aprendemos mais acima, mas você precisa definir a partir de qual atributo essa interface deve se basear para retirar duplicados, e para isso é preciso definir quem vai implementar a comparação para que seja possível a descoberta desses valores iguais, saber usar também [Comparable](https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html) e [Comparator](https://docs.oracle.com/javase/8/docs/api/java/util/Comparator.html) pode ser muito útil no uso com Coleções com Java, de forma geral, é necessário mesmo entender o contexto da implementação em questão e definir qual interface usar, pois, como já falamos, uma interface permite duplicados, outra não, outra o acesso aos dados e mais rápido a partir de um índice o caso do *List,* em casos de tabelas hash o list perde em rapidez para que os dados sejam encontrados, mas novamente precisa entender sobre hashcode() e equals() para saber o porquê.

Um conselho para vida e: **tenha cuidado com que tipo de coleção usar principalmente naqueles casos que se tem muitos relacionamentos entre as entidades, principalmente os de tipo (Lazy), podem acontecer uns comportamentos inesperados nesses casos,** e assim vai, existem outras interfaces que não falei aqui, mas vou deixar o link para você dar uma aprofundada, pois apesar desse artigo ter sido feito com entusiasmo ele é básico e mais conceitual, fechou presença? rsrsr então nos vemos no próximo.

### See you around.🖖