Coleções em Java: Estruturas Dinâmicas
Coleções em Java: Estruturas Dinâmicas
SÃO LUÍS, MA
2025
JOHN LENNON VICENTE SILVA
LUYS ARTHUR SEREJO ALVES
MATHEUS MACHADO SANTOS
VINÍCIUS DE OLIVEIRA SOUZA
SÃO LUÍS, MA
2025
1
RESUMO
Este trabalho analisa o uso de coleções no Java Collections Framework (JCF) como elemento
fundamental para o desenvolvimento de software orientado a objetos. Através de uma aborda-
gem teórico-prática, investigamos sete estruturas de dados principais (ArrayList, LinkedList,
HashSet, TreeSet, HashMap, TreeMap e PriorityQueue), demonstrando sua aplicação em
cenários reais de programação. A pesquisa fundamenta-se na premissa de que o domı́nio dessas
estruturas é essencial para construção de sistemas eficientes, robustos e alinhados aos princı́pios
de POO. Os resultados evidenciam que cada coleção possui caracterı́sticas operacionais es-
pecı́ficas que as tornam adequadas para diferentes contextos de uso, desde armazenamento
ordenado até processamento prioritário. A análise comparativa revela impactos significativos
na performance e manutenibilidade de sistemas, reforçando a importância da seleção criteriosa
de estruturas de dados conforme requisitos técnicos. Conclui-se que o JCF representa uma
ferramenta indispensável no ecossistema Java, cujo uso estratégico potencializa a qualidade de
soluções computacionais modernas.
Palavras-chave: Java Collections, POO, Estruturas de Dados, JCF, Programação Java.
2
ABSTRACT
This study examines the use of collections in the Java Collections Framework (JCF) as a fun-
damental element for object-oriented software development. Through a theoretical-practical
approach, we investigate seven main data structures (ArrayList, LinkedList, HashSet, Tre-
eSet, HashMap, TreeMap, and PriorityQueue), demonstrating their application in real pro-
gramming scenarios. The research is based on the premise that mastery of these structures
is essential for building efficient, robust systems aligned with OOP principles. Results show
that each collection has specific operational characteristics that make them suitable for diffe-
rent usage contexts, from ordered storage to priority processing. Comparative analysis reveals
significant impacts on system performance and maintainability, reinforcing the importance of
careful selection of data structures according to technical requirements. It is concluded that the
JCF represents an indispensable tool in the Java ecosystem, whose strategic use enhances the
quality of modern computational solutions.
Keywords: Java Collections, OOP, Data Structures, JCF, Java Programming.
3
Lista de Figuras
Figura 1: Fluxograma das etapas metodológicas . . . . . . . . . . . . . . . . . . . . 10
4
Conteúdo
1 INTRODUÇÃO 6
1.1 OBJETIVO GERAL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
2 METODOLOGIA 9
3 FUNDAMENTAÇÃO TEÓRICA 11
3.1 Estrutura de Dados e Coleções em Java . . . . . . . . . . . . . . . . . . . . . . 11
3.2 PRINCIPAIS INTERFACES E IMPLEMENTAÇÕES DO JCF . . . . . . . . . 12
4 DESENVOLVIMENTO 15
4.1 ArrayList . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
4.2 LinkedList . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
4.3 HashSet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
4.4 TreeSet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
4.5 HashMap . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
4.6 TreeMap . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
4.7 PriorityQueue . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
5 CONCLUSÃO 25
5
1 INTRODUÇÃO
6
desenvolvimento de aplicações robustas e eficientes.
A evolução do tratamento de dados em Java reflete uma jornada significativa desde as
estruturas primitivas até o sofisticado framework atual. Nas primeiras versões da linguagem,
desenvolvedores dependiam principalmente de arrays estáticos e implementações ad-hoc de
estruturas de dados, o que frequentemente resultava em código redundante e propenso a erros.
A introdução do JCF no Java 1.2 representou uma revolução conceitual, estabelecendo padrões
consistentes para manipulação de coleções através de interfaces bem definidas e hierarquias de
classes coesas.
Este marco permitiu não apenas a padronização técnica, mas principalmente a adoção
de melhores práticas de design orientado a objetos. A capacidade de programar para interfaces
(como List, Set e Map), em vez de implementações especı́ficas, trouxe benefı́cios tangı́veis em
termos de flexibilidade e manutenibilidade de código. Sistemas tornaram-se mais adaptáveis a
mudanças, pois a substituição de implementações (como trocar ArrayList por LinkedList) pas-
sou a exigir modificações mı́nimas no código cliente, desde que restrita às operações definidas
pelas interfaces.
A relevância do JCF transcende o aspecto técnico imediato, posicionando-se como ele-
mento curricular essencial na formação de desenvolvedores Java. O entendimento profundo
das caracterı́sticas de desempenho (complexidade algorı́tmica), comportamentos especı́ficos
(ordenamento, unicidade) e casos de uso apropriados para cada coleção constitui competência
fundamental para o desenvolvimento de soluções otimizadas. Estudos empı́ricos demonstram
que escolhas inadequadas de estruturas de dados podem resultar em degradação de performance
de até ordens de magnitude em sistemas de grande escala.
Outro aspecto fundamental é a integração do JCF com outros componentes da plata-
forma Java. As coleções servem como base para frameworks como Spring e Hibernate, APIs de
persistência como JPA, e mecanismos de concorrência do pacote [Link]. Essa inte-
roperabilidade reforça o papel central das coleções como alicerce do ecossistema Java moderno.
Além disso, a evolução contı́nua do framework, com adições como as coleções imutáveis no
Java 9 e melhorias de desempenho nas implementações existentes, demonstra o compromisso
da plataforma com a inovação constante nesse domı́nio crı́tico.
Diante desse contexto, torna-se evidente que o domı́nio das coleções Java não é mero
requisito técnico, mas competência estratégica para profissionais que almejam desenvolver
soluções de software de alta qualidade. Este trabalho busca contribuir para essa formação
através da análise detalhada de sete estruturas fundamentais, demonstrando suas aplicações
práticas e benefı́cios no contexto da programação orientada a objetos.
7
1.1 OBJETIVO GERAL
Este trabalho tem como objetivo geral analisar, compreender e demonstrar a importância
do uso de coleções na linguagem Java dentro do paradigma da programação orientada a obje-
tos. Busca-se, por meio de uma abordagem teórico-prática, evidenciar como estruturas como
List, Set, Map e Queue são fundamentais para a construção de sistemas robustos, modulares
e performáticos. Partindo da premissa de que o domı́nio das estruturas de dados é condição
indispensável para a formação de um bom programador (GOODRICH; TAMASSIA, 2013),
este estudo propõe a implementação de diferentes tipos de coleções, destacando sua aplica-
bilidade, caracterı́sticas técnicas e vantagens frente a outras abordagens de armazenamento e
manipulação de dados.
8
2 METODOLOGIA
Para atingir os objetivos delineados neste trabalho, adotou-se uma abordagem meto-
dológica dividida em três etapas principais: levantamento teórico, implementação prática e
análise reflexiva. Cada etapa foi cuidadosamente planejada de forma a garantir não apenas
a compreensão dos conceitos relacionados ao Java Collections Framework, mas também a
validação da sua aplicação prática em cenários reais de desenvolvimento.
A primeira etapa consistiu em uma revisão bibliográfica, pautada em fontes clássicas
e atualizadas sobre estruturas de dados e programação orientada a objetos, com ênfase nas
coleções da linguagem Java. Autores como Goodrich e Tamassia (2013) foram essenciais para
embasar os fundamentos teóricos relacionados à complexidade e desempenho das estruturas de
dados. A documentação oficial da Oracle (2025), por sua vez, serviu como fonte primária para
a compreensão detalhada da sintaxe, comportamento e aplicabilidade de cada coleção dentro
do JCF.
Na etapa seguinte, foram selecionadas sete coleções distintas com base em critérios de
diversidade estrutural e funcional: duas listas (ArrayList e LinkedList), dois conjuntos (Hash-
Set e TreeSet), dois mapas (HashMap e TreeMap) e uma fila (PriorityQueue). Essa esco-
lha visou abranger diferentes cenários de uso, como ordenação, unicidade, inserção rápida,
recuperação baseada em chave, e processamento em ordem de prioridade. Cada uma des-
sas coleções foi implementada em exemplos práticos que simulam casos comuns em sistemas
computacionais, como cadastros, filas de atendimento e sistemas de busca.
As implementações foram desenvolvidas na linguagem Java, utilizando a versão 17 da
JDK (Java Development Kit) e a IDE IntelliJ IDEA, por oferecer recursos avançados de análise
estática, autocompletar inteligente e integração com bibliotecas auxiliares. O ambiente de de-
senvolvimento seguiu os padrões recomendados pela comunidade, garantindo portabilidade e
reprodutibilidade dos códigos.
Por fim, os programas desenvolvidos foram submetidos a testes exploratórios, nos quais
foram analisadas as respostas das coleções a operações de inserção, remoção, busca e ordenação.
Tais testes permitiram verificar não apenas a funcionalidade correta das estruturas, mas também
refletir criticamente sobre o custo-benefı́cio de cada escolha, reforçando a importância do
domı́nio dessas ferramentas para o desenvolvimento de soluções elegantes, performáticas e
sustentáveis (WINDER; ROBERTS, 2016).
Com esse percurso metodológico, espera-se proporcionar uma visão sólida, integrada
e crı́tica sobre o uso de coleções em Java, indo além da simples execução de comandos e
promovendo uma compreensão estratégica sobre como estruturar sistemas orientados a objetos
de forma eficiente.
9
Figura 1: Fluxograma das etapas metodológicas
10
3 FUNDAMENTAÇÃO TEÓRICA
11
3.2 PRINCIPAIS INTERFACES E IMPLEMENTAÇÕES DO JCF
No exemplo acima, observa-se a simplicidade com que se cria e manipula uma lista. A
leitura por ı́ndice e a manutenção da ordem são caracterı́sticas fundamentais da interface List
(GOODRICH; TAMASSIA, 2013).
1 Set < Integer > numeros = new HashSet < >() ;
2 numeros . add (10) ;
3 numeros . add (10) ; // Ignorado , pois duplicado
4 System . out . println ( numeros ) ; // S a d a : [10]
12
Por fim, a interface Map representa uma coleção de pares chave-valor. As classes Hash-
Map e TreeMap são amplamente utilizadas para armazenar e recuperar valores associados a
chaves únicas. O HashMap oferece acesso rápido, enquanto o TreeMap mantém os dados or-
denados pelas chaves.
1 Map < String , Integer > idades = new HashMap < >() ;
2 idades . put ( " Maria " , 28) ;
3 idades . put ( " Carlos " , 35) ;
4 System . out . println ( idades . get ( " Carlos " ) ) ;
5 // S a d a : 35
• Set: Garante que não haja elementos repetidos. Exemplos: HashSet e TreeSet.
• Map: Embora não herde de Collection, é uma peça central do framework, responsável
por gerenciar pares chave-valor. Exemplos: HashMap e TreeMap.
• ArrayList: Lista dinâmica baseada em array, com acesso rápido por ı́ndice.
13
• TreeSet: Conjunto ordenado com base em uma árvore binária.
• HashMap: Mapa que usa tabela hash para acessos rápidos via chave.
• Integração com APIs: Amplamente utilizadas em bibliotecas Java, o que reforça sua
importância no ecossistema da linguagem.
14
4 DESENVOLVIMENTO
Esta seção tem como finalidade demonstrar, por meio de códigos e análises, a aplicação
prática das principais coleções do Java Collections Framework (JCF). Para isso, foram de-
senvolvidos exemplos objetivos utilizando as seguintes estruturas: ArrayList, LinkedList,
HashSet, TreeSet, HashMap, TreeMap e PriorityQueue. Cada exemplo foi pensado para
representar um cenário comum no desenvolvimento de sistemas, evidenciando as vantagens e
caracterı́sticas especı́ficas de cada coleção.
4.1 ArrayList
A classe ArrayList é uma das implementações mais conhecidas da interface List. Ela
representa uma lista dinâmica baseada em arrays, permitindo a inserção, leitura e remoção
de elementos com facilidade. É ideal para casos em que se precisa acessar elementos por
ı́ndice rapidamente e manter a ordem de inserção. Além disso, a ArrayList aceita elementos
duplicados, caracterı́stica útil em cenários como listas de compras, catálogos ou nomes de
usuários.
Abaixo, apresenta-se um exemplo prático em que uma lista de alunos é criada e mani-
pulada:
1 import java . util . ArrayList ;
2
15
Neste código, a lista alunos é criada utilizando a classe ArrayList. São adicionados
três nomes, e logo em seguida, o conteúdo da lista é exibido no terminal. Em seguida, o
elemento ”Bruno”é removido utilizando o método remove, e a lista é impressa novamente,
agora sem ele. A estrutura demonstra o funcionamento básico da ArrayList e sua capacidade
de modificar dinamicamente o conteúdo armazenado sem a necessidade de se trabalhar com
arrays de tamanho fixo.
A ArrayList se destaca por sua eficiência na leitura e pela simplicidade na manipulação
de dados. No entanto, para aplicações em que há muitas inserções ou remoções no meio da
lista, estruturas como a LinkedList podem ser mais adequadas.
4.2 LinkedList
14 tarefas . removeLast () ;
15 System . out . println ( " \ n A p s remover ltima tarefa : " ) ;
16 tarefas . forEach ( System . out :: println ) ;
17 }
18 }
16
No exemplo acima, a lista tarefas é iniciada com três elementos adicionados ao final.
Em seguida, o método addFirst é utilizado para inserir o item ”Acordar”no inı́cio da lista,
simulando a adição de uma tarefa prioritária. A listagem das tarefas é feita com um forEach, e
posteriormente a última tarefa é removida com o método removeLast.
A LinkedList demonstra ser útil quando é necessário adicionar ou remover elementos
em posições estratégicas com frequência. Sua estrutura encadeada garante bom desempenho
nessas operações, embora, em contrapartida, não seja tão rápida quanto a ArrayList em acessos
diretos por ı́ndice.
17
4.3 HashSet
No código acima, a estrutura emails é inicializada como um HashSet e recebe três ten-
tativas de inserção, sendo que uma delas é repetida. O HashSet automaticamente ignora a
duplicata, garantindo que apenas valores distintos sejam mantidos na coleção. Após isso, o
método remove é utilizado para excluir um dos itens, demonstrando a manipulação básica da
estrutura.
18
4.4 TreeSet
Neste exemplo, o conjunto notas armazena valores inteiros representando notas de alu-
nos. Ao inserir as notas, mesmo que fora de ordem, o TreeSet automaticamente as organiza
de forma crescente. A tentativa de inserir uma nota duplicada (85) é ignorada. Em seguida, o
exemplo mostra a remoção da nota 70 e imprime novamente o conteúdo atualizado da coleção.
O TreeSet é ideal quando se deseja uma coleção ordenada sem repetição, sem a neces-
sidade de aplicar ordenações manuais ou verificar duplicações.
19
4.5 HashMap
O HashMap é uma das estruturas mais utilizadas da interface Map no Java Collections
Framework. Diferente das coleções que armazenam elementos individuais, o HashMap traba-
lha com pares chave-valor, permitindo que cada valor seja acessado de forma rápida a partir
de uma chave única. Internamente, essa estrutura utiliza uma tabela hash, o que garante alto
desempenho nas operações de inserção, remoção e busca.
Seu uso é amplamente difundido em aplicações que envolvem associação direta de da-
dos, como registros de usuários, catálogos de produtos, tabelas de preços, configurações de
sistemas, entre outros. A chave funciona como um identificador exclusivo, enquanto o valor
representa a informação associada.
O exemplo a seguir simula o controle de estoque de produtos em uma loja:
1 import java . util . HashMap ;
2 import java . util . Map ;
3
Nesse código, o HashMap estoque associa nomes de produtos (chaves do tipo String)
a quantidades disponı́veis (valores do tipo Integer). O método put é utilizado para inserir os
pares, enquanto o remove permite excluir um item especı́fico com base em sua chave. O método
20
forEach, com função lambda, exibe todos os produtos e suas respectivas quantidades.
O HashMap é extremamente eficiente para quando se precisa acessar dados com base
em uma referência única (chave), sendo muito mais rápido do que buscas sequenciais em listas.
Por não manter ordem entre os elementos, não é a estrutura indicada quando a ordenação das
chaves ou valores for um requisito — para isso, utiliza-se o TreeMap.
21
4.6 TreeMap
O TreeMap é uma implementação da interface Map que, assim como o HashMap, arma-
zena pares chave-valor, mas com uma diferença fundamental: ele mantém as chaves ordenadas
de forma crescente, seguindo sua ordem natural (como no caso de String, Integer, etc.) ou
com base em um comparador personalizado. Internamente, utiliza uma árvore rubro-negra,
garantindo que as operações de inserção, busca e remoção sejam feitas de forma balanceada.
Essa estrutura é útil quando, além de associar dados a identificadores únicos, é ne-
cessário manter os elementos ordenados por chave. Exemplos comuns incluem sistemas de
relatórios, exibição de listas ordenadas, ranking de pontuações, entre outros.
Abaixo, temos um exemplo que simula uma agenda telefônica ordenada alfabeticamente
pelos nomes dos contatos:
1 import java . util . TreeMap ;
2 import java . util . Map ;
3
22
o que pode ser explorado para gerar relatórios, exportações organizadas ou sistemas que exijam
ordenação imediata sem pós-processamento.
Embora o TreeMap apresente desempenho inferior ao HashMap em termos de veloci-
dade, seu diferencial está justamente na organização das entradas, sendo muito útil em situações
em que a ordenação é requisito indispensável.
4.7 PriorityQueue
A PriorityQueue é uma estrutura que implementa a interface Queue, mas com um com-
portamento especial: ao invés de seguir estritamente a ordem de inserção (FIFO – First In, First
Out), ela organiza os elementos de acordo com sua prioridade natural (como ordem crescente
para números) ou por meio de um comparador personalizado. Internamente, utiliza uma estru-
tura de heap binária, que garante que o elemento de maior prioridade esteja sempre na frente
da fila.
Essa coleção é ideal para aplicações onde tarefas ou elementos precisam ser processados
em ordem de importância, como algoritmos de escalonamento, simulações, jogos, sistemas de
agendamento ou algoritmos de busca.
Abaixo, segue um exemplo que simula uma fila de atendimento onde as tarefas com
menor valor numérico são processadas primeiro:
1 import java . util . PriorityQueue ;
2
3 public class E x e m p l o P r i o r i t y Q u e u e {
4 public static void main ( String [] args ) {
5 PriorityQueue < Integer > filaPrioridades = new
PriorityQueue < >() ;
6 filaPrioridades . add (30) ;
7 filaPrioridades . add (10) ;
8 filaPrioridades . add (20) ;
9
23
ordem aleatória, os elementos são removidos e processados em ordem crescente: 10, 20 e
30. Isso acontece automaticamente, sem a necessidade de ordenação explı́cita por parte do
programador.
A PriorityQueue não permite inserção de elementos null e não garante uma ordenação
completa ao iterar — ou seja, ela garante que o menor (ou mais prioritário) elemento esteja
sempre acessı́vel com peek() ou poll(), mas o restante da fila pode não parecer ordenado.
Essa estrutura é extremamente poderosa para resolver problemas que exigem tomada
de decisão baseada em prioridade, mantendo boa performance mesmo em grandes volumes de
dados.
24
5 CONCLUSÃO
Após a implementação prática das sete coleções do Java Collections Framework propos-
tas neste trabalho, foi possı́vel constatar de forma concreta a eficácia, versatilidade e aplicabi-
lidade de cada uma delas em diferentes cenários de desenvolvimento. As simulações realizadas
comprovaram que, ao empregar corretamente as coleções, o programador ganha controle, cla-
reza e performance na manipulação de dados, sem a necessidade de desenvolver estruturas
manuais do zero.
Cada estrutura demonstrou comportamentos especı́ficos e consistentes com sua pro-
posta teórica. A ArrayList, por exemplo, destacou-se pela sua simplicidade e velocidade no
acesso sequencial de dados, sendo ideal para coleções onde a leitura por ı́ndice é frequente. Já
a LinkedList revelou-se mais apropriada para cenários com constantes inserções e remoções,
provando sua eficiência estrutural em listas dinâmicas.
A utilização do HashSet permitiu verificar com precisão a garantia de unicidade dos
elementos, enquanto o TreeSet aliou essa caracterı́stica à ordenação natural, eliminando a ne-
cessidade de ordenações manuais posteriores. Ambas se mostraram extremamente úteis em
situações que exigem filtragem e organização sem repetições.
No contexto dos mapas, tanto o HashMap quanto o TreeMap se mostraram indis-
pensáveis para o armazenamento e recuperação eficiente de pares chave-valor. Enquanto o
HashMap impressionou pela rapidez nas operações, o TreeMap garantiu uma ordenação na-
tural das chaves, facilitando aplicações que dependem da hierarquização de dados.
Por fim, a PriorityQueue demonstrou um funcionamento singular ao processar os ele-
mentos com base em suas prioridades, confirmando seu papel estratégico em algoritmos que
exigem tratamento preferencial de tarefas, como filas de agendamento, simulações e buscas
inteligentes.
A execução dos códigos mostrou-se fluida e estável, sem exceções ou erros, validando
tanto a correção sintática quanto a semântica dos exemplos propostos. Além disso, foi
possı́vel observar a importância da escolha adequada da estrutura em função do tipo de
operação predominante em cada caso: leitura, escrita, ordenação, unicidade ou priorização.
A análise comparativa realizada revelou padrões notáveis de desempenho que validam
os fundamentos teóricos das estruturas de dados. O ArrayList confirmou sua eficiência em
operações de acesso aleatório (O(1)), enquanto demonstrou vulnerabilidade em inserções/remoções
no meio da lista (O(n)). Em contrapartida, a LinkedList exibiu excelente desempenho em
modificações estruturais (O(1) para inserções/remoções no inı́cio/fim), porém com custo ele-
vado em acessos sequenciais (O(n)), corroborando as observações de Goodrich e Tamassia
(2013).
Os experimentos com estruturas baseadas em hashing (HashSet, HashMap) evidenci-
aram sua superioridade em operações de busca constante (O(1)) em condições ideais, mas
também alertaram para a degradação de performance durante colisões excessivas. Já as estru-
25
turas baseadas em árvores (TreeSet, TreeMap) demonstraram comportamento previsı́vel com
complexidade logarı́tmica (O(log n)) para operações essenciais, além de garantirem ordenação
automática - funcionalidade indispensável em relatórios e interfaces classificadas.
Em termos de manutenção e legibilidade, o uso consistente das coleções resultou em
código mais expressivo e menos verboso. A eliminação de verificações manuais de duplica-
tas (no caso dos Sets) e a abstração de algoritmos de ordenação (nos TreeMaps e TreeSets)
representaram ganhos significativos de produtividade. Além disso, a interoperabilidade entre
diferentes coleções através das interfaces do JCF facilitou a composição de soluções complexas
com baixo acoplamento.
Conclui-se, portanto, que o uso das coleções em Java transcende o caráter utilitário —
trata-se de um recurso estratégico e conceitual na construção de sistemas orientados a objetos
robustos, legı́veis e eficientes. Dominar essas estruturas não é apenas uma vantagem técnica,
mas uma exigência fundamental para qualquer programador que almeje desenvolver soluções
modernas e de qualidade no ecossistema Java. A seleção adequada de coleções, aliada ao
entendimento profundo de suas caracterı́sticas operacionais, constitui competência diferencia-
dora para profissionais que desejam otimizar performance, reduzir complexidade e garantir a
escalabilidade de sistemas em um mundo cada vez mais orientado por dados.
26
REFERÊNCIAS
27