Utilizando Collections - Parte I

 

Olá pessoal!

 

Neste artigo falaremos sobre as famosas “Collections” do Java. Se você ainda tem dúvida sobre qual delas usar então este artigo é para você. Nós abordaremos melhores práticas e casos de uso das principais implementações.

 

O que podemos chamar de Coleção?

É um objeto onde podemos agrupar vários elementos. No dia-a-dia nos deparamos com várias situações onde as coleções estão presentes: uma fila de banco, uma lista de compras, uma pilha de livros, um conjunto de elementos, etc.

 

Em Java, nós temos toda uma arquitetura para representar e manipular coleções:

 

  • Interfaces: Permitem que as coleções sejam manipuladas independentes de suas implementações;
  • Implementações: Implementam uma ou mais interfaces do framework;
  • Algoritmos: São métodos que realizam operações (sort, reverse, binarysearch, etc) sobre as coleções;

 

Abaixo temos a hierarquia das interfaces do Java Collections Framework:

 

collectionsfig01.JPG

 

Vamos colocar uma breve descrição sobre cada uma delas:

 

Collection: O framework não possui implementação direta desta inferface, porém, ela está no topo da hierarquia definindo operações que são comuns a todas as coleções;

 

Set: Está diretamente relacionada com a idéia de conjuntos. Assim como um conjunto, as classes que implementam esta interface não podem conter elementos repetidos. Usaremos implementações de SortedSet para situações onde desejarmos ordenar os elementos;

 

List: Também chamada de seqüência. É uma coleção ordenada, que ao contrário da inferface Set, pode conter valores duplicados. Além disso, temos controle total sobre a posição onde se encontra cada elemento de nossa coleção, podendo acessar cada um deles pelo índice.

 

Queue: Normalmente utilizamos esta interface quando queremos uma coleção do tipo FIFO (First-In-First-Out), também conhecida como fila.

 

Map: Vamos utilizá-la quando desejarmos uma relação de chave-valor entre os

elementos. Cada chave pode conter apenas um único valor associado. Usaremos

SortedMap para situações onde desejarmos ordenar os elementos.

 

Neste artigo abordaremos as implementações de propósitos gerais, que são as mais comuns no dia-a-dia de um desenvolvedor. Segue abaixo um quadro com o resumo destas implementações:

 

collectionsfig02.JPG

 

Você deve estar se perguntando: como utilizarei uma estrutura FIFO se na tabela não há nenhuma classe que implementa a interface Queue?

 

A classe LinkedList implementa, além da interface List, a interface Queue, portanto, podendo ser utilizada para construir filas.

 

Vamos exemplificar o uso destas classes agrupando-as em Conjuntos, Listas e Chave-Valor.

 

Conjuntos

Vamos analisar o código da classe ExampleSet:

 

collectionscod01.JPG

 

Neste pequeno exemplo já podemos perceber algumas abordagens interessantes no uso de coleções.

 

Vamos lá, podem perguntar: por que HashSet? Suponhamos que o nosso case seja:

 

·         Armazenar elementos sem repetição (neste caso String);

·         Não será necessário manter a ordem em que os elementos são inseridos e nem será feita ordenação alguma no momento da inserção;

 

Com essas características a implementação mais adequada às nossas necessidades é a HashSet, pois possui melhor performance e atende a todos os requisitos levantados.

 

O nosso programa, provavelmente, imprimirá:

 

DACB

Element already exists.

DACB

 

Podemos tirar algumas conclusões:

  • Não é garantido que a ordem da iteração será a mesma da inserção. No nosso caso, inserimos ACBD e o resultado impresso foi DACB;
  • Não foi feita nenhuma ordenação nos elementos inseridos;
  • A tentativa de adicionar um elemento repetido realmente não é possível.

 

O cliente pediu para que agora a ordem dos elementos impressos na tela seja a mesma ordem na qual eles foram inseridos. E agora o que fazer?

 

Um programador, que não conhecesse a API, provavelmente passaria um bom tempo pensando em como implementar esta solução. Mas, ainda bem! Este não é o nosso caso, pessoal! ;)

 

Estamos estudando bastante e sabemos da existência de uma implementação que faz exatamente isso: LinkedHashSet.

 

A única coisa que precisamos alterar no nosso programa é, ao invés de:

 

collectionscod02.JPG

 

O resultado da impressão:

 

ACBD

Element already exists.

ACBD

 

collectionsfig03.JPG

 

Olha nosso cliente de novo! Agora ele quer que os dados sejam impressos em ordem alfabética. Não se preocupem, isso não nos dará muito trabalho. Mais uma vez só precisaremos alterar uma palavra em ExampleSet.

 

Ao invés de:

 

collectionscod03.JPG

 

E como o cliente pediu, a impressão será:

 

ABCD

Element already exists.

ABCD

 

Vamos agora ao nosso próximo tipo de coleção que será publicado na segunda parte deste artigo.

 

Abraços!