Você está na página 1de 10

Caelum

http://www.caelum.com.br

Collections Framework
A amizade um contrato segundo o qual nos comprometemos a prestar
pequenos favores para que no-los retribuam com grandes. Baron de la
Brede et de Montesquieu
Ao trmino desse captulo voc ser capaz de:

deixar de lado as arrays do Java quando performance for mais importante que
memria;

utilizar arrays ou sets dependendo da necessidade do programa;

iterar e ordenar listas e colees e

usar mapas para insero e busca de objetos.

Arrays
A utilizao de arrays complicada em muitos pontos:
- no podemos redimensionar uma array em Java
- impossvel buscar diretamente por um determinado elemento para o qual no se sabe o ndice
- no conseguimos saber quantas posies da array j foram populadas sem criar, para isso, mtodos
auxiliares.

Venda: carro vermelho


carro[3] = null;

Na figura ao lado voc pode ver um


array
que
antes
estava
sendo
completamente utilizado, e que depois teve
um de seus elementos removidos.

Supondo que os dados armazenados representem carros, o que acontece quando precisarmos inserir
um novo carro no estoque?
Precisaremos procurar por um espao vazio?
Iremos guardar em alguma estrutura de dados externa as posies vazias?
E se no houver espao vazio? Teramos de criar um array maior e copiar os dados do antigo para ele?
H mais questes: como sei quantas posies esto sendo usadas no array? Vou precisar sempre
percorrer o array inteiro para conseguir essa informao?
Alm dessas dificuldades que as arrays apresentavam, faltava um conjunto robusto de classes para
suprir a necessidade de estruturas de dados bsicas, como listas ligadas e tabelas de espalhamento.
Com esses e outros objetivos em mente a Sun criou um conjunto de classes e interfaces conhecido
como Collections Framework que reside no pacote java.util.

Collections
A API do Collections robusta e possui diversas classes que representam estruturas
de dados avanadas.

Por exemplo, no necessrio reinventar a roda e criar uma lista ligada mas sim
utilizar aquela que a Sun disponibilizou.

Caelum Ensino e Solues em Java (11) 55712751


www.caelum.com.br - Java e Orientao a Objetos Pgina 14.1

Caelum

http://www.caelum.com.br

Principais interfaces
As colees tm como base a interface Collection, que define mtodos para adicionar e remover um
elemento, verificar se ele est na coleo entre outras operaes, como mostra a tabela a seguir:
Adiciona um elemento na coleo. Como algumas colees no suportam
elementos duplicados, este mtodo retorna true ou false indicando se a
adio foi efetuada com sucesso.
Remove determinado elemento da coleo. Se ele no existia, retorna
false.
Retorna a quantidade de elementos existentes na coleo.
Procura por determinado elemento na coleo, e retorna verdadeiro caso
ele exista. Esta comparao feita baseando-se no mtodo equals() do

boolean add(Object)

boolean remove(Object)
int size()
boolean contains(Object)

objeto, e no atravs do operador

==.

Retorna um objeto que possibilita percorrer os elementos daquela


coleo.

Iterator iterator()

Uma coleo pode implementar diretamente a


interface
Collection, porm existem duas
subinterfaces que so amplamente utilizadas:

List.
A interface

Set define

Set

um conjunto de elementos

nicos enquanto a interface


de elementos.
A busca em um

Set

List

permite a rplica

mais rpida que em um

objeto do tipo List porm a insero mais lenta ao


comparar os algoritmos dos dois objetos.

Map faz
Collection.

A interface
estende

parte do framework mas no

Veremos detalhes sobre cada uma dessas


interfaces e suas principais implementaes a seguir.

Classe de exemplo
Para este captulo iremos utilizar a classe a seguir:
public class Pais {
// o nome do pais
public String nome;
// tamanho do terreno do pais
public double kmQuadrados;
}

Lista
Uma lista uma coleo que permite elementos duplicados e mantendo uma ordenao especfica
entre os elementos.

Caelum Ensino e Solues em Java (11) 55712751


www.caelum.com.br - Java e Orientao a Objetos Pgina 14.2

Caelum

http://www.caelum.com.br

Em outras palavras, voc tem a garantia de que, quando percorrer a lista, os elementos sero
encontrados em uma ordem pr-determinada, definida na hora da insero dos mesmos.
A implementao mais famosa da interface

List a ArrayList que trabalha com uma array interna para


LinkedList, que mais

gerar uma lista portanto ela mais rpida na pesquisa que sua concorrente, a
rpida na insero e remoo de itens nas pontas.

Para criar um
o construtor:

ArrayList basta chamar

ArrayList lista = new ArrayList();

sempre possvel abstrair a lista a


partir da interface List:
List mesmaLista = lista;

A interface

add, um
inserido e
segundo
elemento
mesma.

List

possui dois mtodos

que recebe o objeto a ser


o coloca no final da lista e um
que permite adicionar o
em qualquer posio da

A interface List e algumas classes


que a implementam podem ser vistas
no diagrama UML ao lado.
O exemplo a seguir gera trs pases e insere eles no fim de uma lista. Importante: os quilmetros
quadrados so meramente ilustrativos!
O grfico da direita mostra a lista aps incluir os trs pases

Brasil, Japo e Eua.

public class TestaArrayList {

Lista Os pases

public static void main(String args[]) {


Pais brasil = new Pais();
brasil.nome = Brasil;
brasil.kmQuadrados = 1000;

- O pas Brasil est na lista?

Pais japao = new Pais();


japao.nome = Japao;
japao.kmQuadrados = 500;

if(lista.contains(brasil)) {
// sim!
}

Pais eua = new Pais();


eua.nome = EUA;
eua.kmQuadrados = 100;

- Remova o pas Japo:


lista.remove(japao);

ArrayList lista = new ArrayList();


lista.add(brasil);
lista.add(japao);
lista.add(eua);

- Remova o segundo pas.


lista.remove(1);

- Limpe a lista.
lista.clear();

System.out.println("Tamanho :" +
lista.size());
}
}

O mtodo

get(int)

retorna o elemento na posio especificada como parmetro, iniciando na posio

zero, assim como trabalhando com uma


uma

array comum.

Atravs dele e do mtodo

ArrayList.
Caelum Ensino e Solues em Java (11) 55712751
www.caelum.com.br - Java e Orientao a Objetos Pgina 14.3

size fica

fcil percorrer

Caelum

http://www.caelum.com.br

Vale lembrar que o exemplo a seguir mostra que, em uma lista, a ordem dos elementos no
alterada:
public class MostraArrayList {
public static void main(String args[]) {
Pais brasil = new Pais();
brasil.nome = "Brasil";
brasil.kmQuadrados = 1000;
Pais japao = new Pais();
japao.nome = Japao;
japao.kmQuadrados = 500;
Pais eua = new Pais();
eua.nome = EUA;
eua.kmQuadrados = 500;
ArrayList lista = new ArrayList();
lista.add(brasil);
lista.add(japao);
lista.add(eua);
// passa por cada item, at lista.size()
for(int i = 0; i != lista.size(); i++) {
// faz o cast
Pais paisAtual = (Pais) lista.get(i);
// imprime o valor
System.out.println(paisAtual.nome);
}
}
}

importante lembrar que uma coleo sempre trabalha com


fazer o cast na referncia, passando de
obtido da coleo.

Object

Object

portanto existe a necessidade de

para a classe apropriada antes de utilizar o elemento

Acesso aleatrio
Algumas listas, como a ArrayList, tem acesso aleatrio aos seus elementos: a busca por
um elemento em uma determinada posio feita de maneira imediata, sem que a lista
inteira seja percorrida.
Neste caso o acesso feito atravs do mtodo get(int) e muito rpido.
Uma lista uma excelente alternativa a um array comum j que temos todos os benefcios de arrays,
sem a necessidade de tomar cuidado com remoes, falta de espao etc.
A outra implementao muito usada (LinkedList), fornece mtodos adicionais para obter e remover o
primeiro e ltimo elemento da lista.

Vector
Outra implementao a tradicional classe Vector, presente desde o Java 1.0, que foi
adaptada para uso com o framework de collections, com a incluso de novos mtodos.
Ela deve ser tratada com cuidado pois lida de uma maneira diferente com processos
correndo em paralelo e ser mais lento que uma ArrayList quando no houver acesso
simultneo aos dados.

Caelum Ensino e Solues em Java (11) 55712751


www.caelum.com.br - Java e Orientao a Objetos Pgina 14.4

Caelum

http://www.caelum.com.br

Mapas
Um mapa composto de uma associao de um objeto chave a um objeto valor.
Ele um mapa pois possvel us-lo para mapear uma chave, por exemplo: mapeie o valor Estados
Unidos chave norte, ou mapeie Oceano chave sul.

chaves

valores
Possveis
mapa:

aes

em

um

Mapeie uma ilha ao Norte.


O que est mapeado no Sul?
Remapeie oceano ao Norte.
Quero o conjunto de chaves.
Quero o conjunto de valores.
O que est mapeado ao
Leste?
Desmapeie o Leste.

Algumas linguagens, como Perl, PHP, possuem suporte nativo a mapas,


onde so conhecidos como matrizes associativas.
O mtodo put(Object, Object) da interface Map recebe a chave e o valor
de uma nova associao. Para saber o que est associado a um determinado
objeto-chave, passa-se esse objeto no mtodo get(Object). Observe o
exemplo:
String guiana = Guiana Francesa;
String uruguai = Uruguai;
// cria o mapa
Map mapa = new HashMap();
// adiciona algo ao norte e algo ao sul
mapa.put(norte, guiana);
mapa.put(sul, uruguai);
// que pais esta associado a String sul?
Object elemento = mapa.get(sul);
String pais = (String) elemento;

Um mapa, assim como as colees, trabalha diretamente com

Objects,

o que torna necessrio o

casting no momento que recuperar elementos. Suas principais implementaes so o

HashMap

e o

Hashtable.
Apesar do mapa fazer parte do framework, ele no implementa a interface Collection, por ter um
comportamento bem diferente. Porm, as colees internas de um mapa (a de chaves e a de valores, ver
Figura 7) so acessveis por mtodos definidos na interface Map.

Caelum Ensino e Solues em Java (11) 55712751


www.caelum.com.br - Java e Orientao a Objetos Pgina 14.5

Caelum

http://www.caelum.com.br

O mtodo keySet() retorna um Set com as chaves daquele mapa, e o


Collection com todos os valores que foram associados a alguma das chaves.
Um mapa importante a tradicional classe
configurao de aplicaes.

Properties,

que mapeia

mtodo

strings e

values()

retorna a

muito utilizada para a

Properties config = new Properties();


config.setProperty(database.login, scott);
config.setProperty(database.password, tiger);
config.setProperty(database.url,jdbc:mysql:/localhost/teste);
// muitas linhas depois
String login = config.getProperty(database.login);
String password = config.getProperty(database.password);
String url = config.getProperty(database.url);
DriverManager.getConnection(url, login, password);

Repare que no houve a necessidade do casting para


associados. Isto porque a classe
entre

String

no momento de recuperar os objetos

Properties foi desenhada com o propsito de trabalhar com a associao

Strings.

A Properties possui tambm mtodos para ler e gravar o mapeamento com base em um arquivo
texto, facilitando muito a sua persistncia.

Conjunto
Um conjunto (Set) funciona de
forma anloga aos conjuntos da
matemtica, ele uma coleo que
no permite elementos duplicados.

Possveis aes em um conjunto:

- A camiseta Azul est no conjunto?


- Remova a camiseta Azul.

Outra caracterstica fundamental


dele o fato de que a ordem em que
os elementos so armazenados pode
no ser a ordem na qual eles foram
inseridos no conjunto.

- Adicione a camiseta Vermelha.


- Limpe o conjunto.
No
duplicados!

elementos

- Ao percorrer um conjunto, sua

Tal ordem varia de implementao


para implementao.
Um conjunto representado pela interface

HashSet e TreeSet.

existem

Set e tem como suas principais implementaes as classes

O cdigo a seguir cria um conjunto e adiciona trs itens, apesar


de tentar adicionar quatro:

Set conjunto = new


conjunto.add(item
conjunto.add(item
conjunto.add(item
conjunto.add(item

HashSet();
1);
2);
3);
3);

// imprime a sequncia na tela


System.out.println(conjunto);

Caelum Ensino e Solues em Java (11) 55712751


www.caelum.com.br - Java e Orientao a Objetos Pgina 14.6

Caelum

http://www.caelum.com.br

O resultado so os elementos do conjunto, a ordem na qual eles aparecem podem ou no ser a ordem
na qual eles foram inseridos e incorreto supor que ser sempre a mesma ordem!

Ordenando um set
Seria possvel usar uma outra implementao de conjuntos, como um TreeSet, que
insere os elementos, de tal forma, que quando forem percorridos, aparecem em uma
ordem definida pelo mtodo de comparao entre seus elementos. Esse mtodo
definido pela interface java.lang.Comparable.

Iterando sobre colees


Como percorrer os elementos de uma coleo? Se for uma lista, podemos sempre utilizar um lao
chamando o mtodo

get para cada elemento. Mas e se a coleo no permitir indexao?

Por exemplo, um
do conjunto...

Set no

for,

possui uma funo para pegar o primeiro, o segundo ou o quinto elemento

Toda coleo fornece acesso


a um iterator, um objeto que
implementa
a
interface
Iterator,
que
conhece
internamente a coleo e d
acesso a todos os seus
elementos, como a figura ao
lado mostra.

Possveis aes em um iterador:


- Existe um prximo elemento na
coleo?.
- Pegue o prximo elemento.
- Remova o elemento atual da
coleo.
Camiseta c =
(Camiseta) iterator.next();

Primeiro
criamos
um
Iterator que entra na coleo.
A cada chamada do mtodo
next, o Iterator retorna o
prximo objeto do conjunto.

Um iterator pode ser obtido com o mtodo

iterator() de Collection, por exemplo:

Iterator i = lista.iterator();

A interface

Iterator

possui dois mtodos principais:

existe um elemento a ser percorrido;

hasNext()

(com retorno booleano) indica se ainda

next() retorna o prximo objeto.

Voltando ao exemplo do conjunto de strings, vamos percorrer o conjunto:


// popula o conjunto
Set conjunto = new HashSet();
conjunto.add(item 1);
conjunto.add(item 2);
conjunto.add(item 3);
// retorna o iterator
Iterator i = conjunto.iterator();
while (i.hasNext()) {
// recebe a palavra
Object elemento = i.next();
String palavra = (String) elemento;
// mostra ela
System.out.println(palavra);
}

Caelum Ensino e Solues em Java (11) 55712751


www.caelum.com.br - Java e Orientao a Objetos Pgina 14.7

Caelum

http://www.caelum.com.br

while anterior s termina quando todos os elementos do conjunto forem percorridos, isto , quando
hasNext mencionar que no existem mais itens.

o mtodo

Em que ordem sero acessados os elementos?


Numa lista, os elementos iro aparecer de acordo com o ndice em que foram inseridos, isto , de
acordo com o que foi pr-determinado. Em um conjunto, a ordem depende da implementao da
interface Set.
Por que o Set ento to importante e usado?
Para perceber se um item j existe em uma lista muito mais rpido usar um Set do que um List, e
os TreeSets j vem ordenados de acordo com as caractersticas que desejarmos!

ListIterator
Uma lista fornece, alm de acesso a um Iterator, um ListIterator, que oferece recursos
adicionais, especficos para listas.
Usando o ListIterator voc pode, por exemplo, adicionar um elemento na lista ou
voltar para o elemento que foi "iterado" anteriormente.

Ordenao
Muitas vezes queremos percorrer a nossa coleo de maneira ordenada. Mas como definir a ordem dos
objetos?
Vimos anteriormente que as listas so percorridas de maneira pr-determinada de acordo com a
incluso dos itens e que os conjuntos so percorridos de forma (at agora) indeterminada.
necessrio capacitar nosso programa na comparao de dois objetos da coleo. Para isso existem
duas maneiras:
Uma fazer com que os elementos da sua coleo implementem a interface

java.lang.Comparable,

int compareTo(Object). Este mtodo deve retornar zero se o objeto comparado for
negativo se este objeto for menor que o objeto dado, e um nmero
positivo se este objeto for maior que o objeto dado.

que define o mtodo

igual a este objeto, um nmero

Para ordenar os carros por velocidadeMaxima, basta implementar o

Comparable:

public class Carro implements Comparable {


// ... todo o codigo anterior fica aqui
public int compareTo(Object object) {
Carro outro = (Carro) object;
if(this.velocidadeMaxima < outra.velocidadeMaxima) {
return -1;
}
if(this.velocidadeMaxima > outra.velocidadeMaxima) {
return 1;
}
return 0;
}
}

Caelum Ensino e Solues em Java (11) 55712751


www.caelum.com.br - Java e Orientao a Objetos Pgina 14.8

Caelum

http://www.caelum.com.br

Com o cdigo anterior, nossa classe tornou-se comparvel: dados dois objetos da classe,
conseguimos dizer se um objeto maior, menor ou igual ao outro, segundo algum critrio por ns
definido. No nosso caso, a comparao ser feita baseando-se na velocidade mxima do carro.
Como fazemos para ordenar a coleo? Podemos usar os mtodos da classe utilitria Collections, que
inclui uma srie de mtodos estticos que realizam funes comuns em colees. Voc pode ordenar uma
lista, obter o maior elemento de uma coleo, entre muitas outras funcionalidades, j que seus
elementos agora so comparveis. A tabela a seguir mostra alguns dos mtodos da Collections.
int binarySearch (List,

Object)

Realiza uma busca binria por determinado


elemento na lista ordenada, e retorna sua posio,
ou um nmero negativo caso no encontrado.
Retorna o maior elemento da coleo.

Object max(Collection)
Object min(Collection)
void sort(List)

Retorna o menor elemento da coleo.


Ordena a lista dada em ordem ascendente.

Muitos mtodos exigem que os objetos sejam comparveis. O seguinte exemplo mostra como
simples ordenar uma lista:
List carros = new ArrayList();
// adiciona o primeiro carro
Carro c1 = new Carro();
c2.setVelocidadeMaxima(200);
carros.add(c1);
// adiciona o segundo carro
Carro c2 = new Carro();
c2.setVelocidadeMaxima(100);
carros.add(c2);
// ordena
Collections.sort(carros);

Outro jeito de ordenar, que ordena a cada insero, utilizando o


os carros j estaro ordenados!

TreeSet. Ao final do cdigo a seguir,

Collection carros = new TreeSet();


// adiciona o primeiro carro
Carro c1 = new Carro();
c2.setVelocidadeMaxima(200);
carros.add(c1);
// adiciona o segundo carro
Carro c2 = new Carro();
c2.setVelocidadeMaxima(100);
carros.add(c2);

Comparable, voc pode fornecer um java.util.Comparator


Collections. Por exemplo, temos tambm o mtodo sort(List,

Opcionalmente, em vez de implementar


como argumento a alguns dos mtodos da

Comparator),

que muito utilizado se voc no tem acesso ao cdigo fonte da classe dos seus
elementos, ou se for necessrio ordenar uma lista de vrias maneiras diferentes.

Jakarta Commons Collections


O projeto Jakarta possui uma srie de APIs menores, conhecidas como jakartacommons. Dentre elas, existe algumas classes de colees diferentes das encontradas
no java.util, assim como algumas classes auxiliares.

Caelum Ensino e Solues em Java (11) 55712751


www.caelum.com.br - Java e Orientao a Objetos Pgina 14.9

Caelum

http://www.caelum.com.br

As colees do jakarta incluem a interessante interface Predicate, onde voc pode


definir uma query para executar sobre uma coleo, trazendo um Iterator que itera
apenas sobre os objetos que obedecem ao predicado dado.
Por exemplo, com uma coleo de carros, necessrio um iterator apenas para os
carros verdes.
Entre outras, as Jakarta Collections possuem colees para tipos primitivos,
eliminando a necessidade de utilizar as classes wrapper do Java. Tambm existe um
heap binrio, no qual a coleo est ordenada de tal maneira que possvel obter o
valor mximo (ou mnimo) rapidamente, em tempo constante (ou O(1)).

Boas prticas
As colees do Java oferecem grande flexibilidade ao usurio. A perda de performance
em relao a utilizao de arrays irrelevante, mas deve-se tomar algumas precaues:
- Grande parte das colees usam internamente uma array para armazenar os seus
dados. Quando essa array no mais suficiente, criada uma maior e o contedo da
antiga copiado. Este processo pode acontecer muitas vezes no caso de voc ter uma
coleo que cresce muito. Voc deve ento criar uma coleo j com uma capacidade
grande, para evitar o excesso de redimensionamento.
- Evite usar colees que guardam os elementos pela sua ordem de comparao
quando no h necessidade. Um TreeSet gasta computacionalmente O(log(n)) para
inserir (ele utiliza uma rvore rubro-negra como implementao), enquanto o HashSet
gasta apenas O(1).
- No itere sobre uma List utilizando um for de 0 at list.size(), e usando get(int) para
receber os objetos. Enquanto isso parece atraente, algumas implementaes da List
no so de acesso aleatrio como a LinkedList, fazendo esse cdigo ter uma pssima
performance computacional.

Exerccios
1-) Crie no projeto de trens uma classe
uma

ArrayList.

Carga, guarde diversas Cargas dentro de um trem atravs de

cdigo para cada trem e mapeie os trens por cdigo em um HashMap. Utilize esse
HashMap para recuperar cada um desses trens.

2-) Crie um campo


mesmo

3-) Altere a forma de comparao de dois carros atravs da velocidade atual. Veja o que acontece ao
alterar a velocidade de um carro que j est no TreeSet.

Desafios
1-) Gere todos os nmeros entre 1 e 1000 e ordene em ordem no crescente utilizando um

TreeSet.

2-) Gere todos os nmeros entre 1 e 1000 e ordene em ordem no crescente utilizando um

ArrayList.

Caelum Ensino e Solues em Java (11) 55712751


www.caelum.com.br - Java e Orientao a Objetos Pgina 14.10

Você também pode gostar