DEV Community

Gabriel Bahia.
Gabriel Bahia.

Posted on

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

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

Árvore, coleções e Mapas Java

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)🤣

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 com Collections) 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 final, inclusive está nele a “sacada da sacada” referente a performance que citei acima). rsrsrs 🥳

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

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 , 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 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,** é 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 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.🤭

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() 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 e Comparator 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.🖖

Discussion (0)