Escolar Documentos
Profissional Documentos
Cultura Documentos
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;
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.
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
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)
==.
Iterator iterator()
List.
A interface
Set define
Set
um conjunto de elementos
Set
List
permite a rplica
Map faz
Collection.
A interface
estende
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
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
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:
A interface
add, um
inserido e
segundo
elemento
mesma.
List
Lista Os pases
if(lista.contains(brasil)) {
// sim!
}
- Limpe a lista.
lista.clear();
System.out.println("Tamanho :" +
lista.size());
}
}
O mtodo
get(int)
array comum.
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);
}
}
}
Object
Object
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
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
Objects,
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
http://www.caelum.com.br
Properties,
que mapeia
mtodo
strings e
values()
retorna a
String
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.
elementos
HashSet e TreeSet.
existem
HashSet();
1);
2);
3);
3);
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.
Por exemplo, um
do conjunto...
Set no
for,
Primeiro
criamos
um
Iterator que entra na coleo.
A cada chamada do mtodo
next, o Iterator retorna o
prximo objeto do conjunto.
Iterator i = lista.iterator();
A interface
Iterator
hasNext()
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
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.
Comparable:
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)
Object max(Collection)
Object min(Collection)
void sort(List)
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);
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.
Caelum
http://www.caelum.com.br
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.
cdigo para cada trem e mapeie os trens por cdigo em um HashMap. Utilize esse
HashMap para recuperar cada um desses trens.
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.