Você está na página 1de 44

Módulo VIII

Coleções
Coleções e Visibilidade - Alessandro Cerqueira - 20/8/2007

Objetivo
Apresentar as principais classes de
coleção de Java
Introduzir os conceitos de
interface e realização
2

Coleções
• Considere o seguinte exemplo:
1 aloca  1..*
Departamento Empregado
Sigla 0..1 é gerenciado por  1 CPF
Nome
Coleçções e Visibilidade - Alessandro Cerqueira - 20/8/2007

Nome

• Ao codificarmos estas classes, precisamos decidir como iremos


implementar os relacionamentos em Java. Para isto, será
será necessá
necessário
colocar novos atributos nas classes. Estes novos atributos são
chamados de Atributos Implí
Implícitos.
citos.
• Regra Geral:
– Para cada associaç
associação ou agregaç
agregação navegá
navegável presente na classe,
adicionamos um atributo implí
implícito.
• Para relacionamentos uná
unários colocamos um atributo cujo tipo
deverá
deverá ser “ponteiro para um objeto da classe XXX”
XXX”
• A grande questão é como são implementados os relacionamentos
Cole

n-ários.
rios. Uma primeira idé
idéia é utilizarmos arrays para isto.
3

Coleções
public class Departamento public class Empregado
{ {
private String cpf;
cpf;
private String sigla; private String nome;
private String nome; private Departamento depto;
private Empregado[] listaEmpregados;
listaEmpregados;
private Empregado gerente;
public Empregado(String cpf,
cpf, String nome,
public Departamento(String sigla, String nome) Departamento depto)
Coleçções e Visibilidade - Alessandro Cerqueira - 20/8/2007

{ {
this.sigla
this.sigla = sigla; this.
this.cpf = cpf;
cpf;
this.nome
this.nome = nome; this.nome
this.nome = nome;
this.
this.listaEmpregados = new Empregado[100]; this.
this.setDepto(depto);
setDepto(depto);
} }
public void addEmpregado(Empregado
addEmpregado(Empregado novoEmp)
novoEmp)
{
... public void setDepto(Departamento
setDepto(Departamento depto)
} {
public void removeEmpregado(Empregado
removeEmpregado(Empregado exEmp)
exEmp) ...
{ }
... ...
} }
...
}

• Nota: Observe que as duas associaç


associações são navegá
navegáveis a partir de Departamento, mas na
classe Empregado somente a associaç
associação “Aloca”
Aloca” é navegá
navegável; por isso é que temos somente
Cole

um atributo implí
implícito em Empregado, enquanto que em Departamento temos dois.
4

Exemplo
Relacionamentos Bidirecionais

String
String
“RH”
RH” Empregado
Departamento “12345678-
12345678-90”
90”
cpf:
cpf:
Coleçções e Visibilidade - Alessandro Cerqueira - 20/8/2007

sigla:
sigla:null String
nome:
nome:
nome:null “Recursos String
Humanos”
Humanos” depto:
listaEmpregados:
listaEmpregados:
listaEmpregados
listaEmpregados : null
:
“José
José ”
gerente:
gerente:null

String
Empregado
null null “09876543-
09876543-21”
21”
0 1 2 ... 99 cpf:
cpf:
nome:
String
depto:
“Maria”
Maria”
Cole
5

Métodos para Estabelecer Relacionamentos

• Alé
Além de colocarmos os atributos implí
implícitos, necessitamos
colocar mé
métodos que estarão estabelecendo os relacionamento
entre os objetos e, conseqü
conseqüentemente, manipulando os
atributos implí
implícitos.
Coleçções e Visibilidade - Alessandro Cerqueira - 20/8/2007

• Caso o relacionamento seja uná


unário (ou seja, se o atributo
implí
implícito não é uma coleç
coleção),
ão), deveremos colocar um método
set___.
set___.
• Caso o relacionamento seja n-ário (ou seja, se o atributo
implí
implícito é uma coleç
coleção),
ão), deveremos colocar os métodos
add___ e remove___.
remove___.
• A implementaç
implementação destes mé
métodos deve levar em conta se o
relacionamento é unidirecional ou bidirecional.
Cole
6

Métodos para Estabelecer


Relacionamentos Bidirecionais
NA CLASSE EMPREGADO
public void setDepto(
setDepto(Departamento depto)
{
// Se a referência para o departamento do Empregado é a mesma que
// está
está sendo recebida pelo parâmetro, não há há necessidade de atualizaç
atualização
if(
(this.depto
if this .depto == depto)
return;
return;
// Se o parâmetro é null,
null, isto indica que o Empregado deve ser retirado
Coleçções e Visibilidade - Alessandro Cerqueira - 20/8/2007

// do departamento.
if(depto
if(depto == null)
null)
{
Departamento antigo = this.depto;
this.depto;
// Apago a referência antiga
this.depto
this.depto = null;
null;
// Solicito ao Departamento para retirar sua referência para o Empregado
Empregado
antigo.removeEmpregado
antigo.removeEmpregado( (this);
this);
}
else
{
// Se o Empregado já já pertence a um Departamento, vou solicitar sua remoç
remoção para
// colocá
colocá-lo em outro Departamento.
if(
if this.depto != null)
(this.depto null)
this.depto.
this.depto.removeEmpregado
removeEmpregado( (this);
this);
// Estabeleç
Estabeleço a referência
this.depto
this.depto = depto;
// solicito ao Departamento para adicionar uma referência para o Empregado.
depto.
depto.addEmpregado(
addEmpregado(this);
this);
}
Cole

}
7

Métodos para Estabelecer


Relacionamentos Bidirecionais
NA CLASSE DEPARTAMENTO
public void addEmpregado(
addEmpregado(Empregado novoEmp)
novoEmp)
{
// Se a referência para o Empregado já já está
está presente na lista de
// Empregados do Departamento, não há há necessidade de atualizaç
atualização
if(
if(this.
this.listaEmpregados.
listaEmpregados.contains(
contains(novoEmp))
novoEmp))
return;
return;
Coleçções e Visibilidade - Alessandro Cerqueira - 20/8/2007

// Solicito ao objeto de coleç


coleção referenciado por this.
this.listaEmpregados
// que adicione uma referência para o novo empregado
this.
this.listaEmpregados.
listaEmpregados.add(
add(novoEmp);
novoEmp);
// Solicito ao Empregado que referencie o seu novo departamento
novoEmp.
novoEmp.setDepto(
setDepto(this);
this);
}

public void removeEmpregado(


removeEmpregado(Empregado exEmp)
exEmp)
{
// Se a referência para o Empregado não estáestá presente na lista de
// Empregados do Departamento, não há há necessidade de atualizaç
atualização
if( ! this.
if( this.listaEmpregados.
listaEmpregados.contains(
contains(exEmp))
exEmp))
return;
return;
// Solicito ao objeto de coleç
coleção referenciado por this.
this.listaEmpregados
// que remova a referência para o ex-ex-empregado
this.
this.listaEmpregados.
listaEmpregados.add(
add(exEmp);
exEmp);
// Solicito ao Empregado que deixe de referenciar o departamento
exEmp.
exEmp.setDepto(
setDepto(null);
null);
Cole

}
8

Exemplo Relacional
• A idé
idéia de adicionarmos atributos para a implementaç
implementação de
relacionamentos també
também ocorre com o uso do modelo
relacional atravé
através do conceito de Chave Estrangeira.
Estrangeira.
• Lá, entretanto, não há
há a diferenç
diferença entre relacionamentos
Coleçções e Visibilidade - Alessandro Cerqueira - 20/8/2007

unidirecionais e bidirecionais.
• Para descobrirmos dados entre as entidades relacionadas, nó
nós
necessitamos realizar operaç
operações de JUNÇ
JUNÇÃO.
ÃO.

DEPARTAMENTO EMPREGADO
sigla nome gerente cpf nome depto
JR Jurídico 901-2 123-4 José LG
LG Logística 123-4 567-8 Maria LG
901-2 Patrícia JR
345-6 João JR
Cole
9

Uma Forma de Execução da Junção


SELECT D.Nome, E.Nome (3º
(3º- projeç
projeção)
FROM Departamento D, Empregado E (1º
(1º- Prod.Cartesiano)
Prod.Cartesiano)
WHERE D.gerente = E.Cpf
E.Cpf (2º
(2º- Seleç
Seleção)
Coleçções e Visibilidade - Alessandro Cerqueira - 20/8/2007

D.sigla D.nome D.gerente E.cpf E.nome E.depto


E.depto
JR Jurídico 901-2 123-4 José LG
JR Jurídico 901-2 567-8 Maria LG
JR Jurídico 901-2 901-2 Patrícia JR
JR Jurídico 901-2 345-6 João JR
LG Logística 123-4 123-4 José LG
LG Logística 123-4 567-8 Maria LG
LG Logística 123-4 901-2 Patrícia JR
LG Logística 123-4 345-6 João JR
Cole
10

Coleções
implementação de atributos n-ários com arrays não é adequada.
• A implementaç
(Arrays ou apresentam disperdí
disperdício ou apresentam falta de posiç
posições de
memó
memória).
idéia melhor é utilizar a classe java.
• Uma idé java.util.
util.Vector.
Vector.
• Comparaç
Comparação entre Array x Vector
Coleçções e Visibilidade - Alessandro Cerqueira - 20/8/2007

– Arrays
• Tamanho fixo e definido na criaç
criação do array.
array.
• Procura pelo índice.
• Elementos do mesmo tipo.
• Arrays de tipos primitivos ou de ponteiros para instâncias de uma
classe especí
específica.
– Objetos Vector
• O tamanho inicial é definido quando o vector é criado. Este pode ser
modificado manualmente ou automaticamente.
• Procura pelo índice ou conteú
conteúdo.
• Elementos de qualquer classe.
• Vectors de ponteiros para instâncias de uma classe especí
específica
Cole
11

Coleções
public class Departamento public class Empregado
{ {
private String cpf;
cpf;
private String sigla; private String nome;
private String nome;
private Departamento depto;
private Vector listaEmpregados;
listaEmpregados;
private Empregado gerente;
Coleçções e Visibilidade - Alessandro Cerqueira - 20/8/2007

public Empregado(String cpf,


cpf, String nome,
public Departamento(String sigla, String nome) Departamento depto)
{ {
this.sigla
this.sigla = sigla; this.
this.cpf = cpf;
cpf;
this.nome
this.nome = nome; this.nome
this.nome = nome;
this.
this.listaEmpregados = new Vector(
Vector( ); this.
this.setDepto(depto);
setDepto(depto);
} }
public void addEmpregado(Empregado
addEmpregado(Empregado novoEmp)
novoEmp)
{
... public void setDepto(Departamento
setDepto(Departamento depto)
} {
public void removeEmpregado(Empregado
removeEmpregado(Empregado exEmp)
exEmp) ...
{ }
... ...
}
... }
}
Cole
12

Exemplo com Vector


Relacionamentos Bidirecionais

String
String
“RH”
RH” Empregado
Departamento “12345678-
12345678-90”
90”
cpf:
cpf:
Coleçções e Visibilidade - Alessandro Cerqueira - 20/8/2007

sigla:
sigla:null String
nome:
nome:
nome:null “Recursos String
Humanos”
Humanos” depto:
listaEmpregados:
listaEmpregados:
listaEmpregados
listaEmpregados : null
:
“José
José ”
gerente:
gerente:null

Vector
String
0 Empregado
1 “09876543-
09876543-21”
21”
cpf:
cpf:
nome:
String
depto:
“Maria”
Maria”
Cole
13

Coleções
• Alguns mé
métodos úteis da classe Vector:
Vector:
– Vector()
Vector(): :Cria uma nova instância sem elementos e com capacidade
inicial para 10 elementos.
– Vector(int capacidade): Cria uma nova instância sem elementos e
Vector(int capacidade):
com capacidade inicial especificada pelo parâmetro.
– Vector(int
Vector(int capacidade, int fator): fator): Cria uma nova instância
Coleçções e Visibilidade - Alessandro Cerqueira - 20/8/2007

sem elementos e com capacidade inicial / fator de crescimento


especificados pelos parâmetros.
– add(
add(Object elem)elem): adiciona um objeto no final do Vector.
Vector.
add(int índice, Object elem): adiciona um objeto na posiç
– add(int posição
especificada que deve estar entre 0 e o tamanho do Vector.
Vector.
– setElementAt(
setElementAt(Object elem,int ndice): coloca o objeto em
elem,int índice):
determinada posiç
posição, removendo o objeto que estiver lá
lá anteriormente.
– remove(Object
remove(Object elem) elem): remove a primeira ocorrência do objeto no
Vector. Retorna true caso tenha sido possí
Vector. possível a remoç
remoção.
ndice): remove o objeto na posiç
– remove (int índice): posição especificada.
size():: retorna o nú
– size() número de objetos presentes no Vector.
Vector.
Cole
14

Coleções
– get(int ndice): Retorna o objeto presente na posiç
get(int índice): posição especificada.
– firstElement():: Retorna o objeto presente na primeira posiç
firstElement() posição.
– lastElement():: Retorna o objeto presente na última posiç
lastElement() posição.
– indexOf(
indexOf(Object elem) elem): retorna o índice da primeira ocorrência do
Coleçções e Visibilidade - Alessandro Cerqueira - 20/8/2007

objeto no Vector ou -1 se o objeto não estiver presente.


– indexOf(
indexOf(Object elem,int ndice): retorna o índice da primeira
elem,int índice):
ocorrência do objeto no Vector a partir da posiç
posição especificada. Retorna -
1 se o objeto estiver presente.
– lastIndexOf(
lastIndexOf(Object elem) elem): retorna o índice da última ocorrência do
objeto no Vector ou -1 se o objeto não estiver presente.
– lastIndexOf(
lastIndexOf(Object elem,int ndice): retorna o índice da última
elem,int índice):
ocorrência do objeto no Vector a partir da posiç
posição especificada. Retorna
-1 se o objeto estiver presente.
– contains(
contains(Object elem) elem): Informa se o objeto está
está presente no
Vector.
Vector.
Cole
15
Legenda

Coleções no JDK 1.2 Interface

• Com o advento do jdk 1.2,


1.2, A classe Vector está
está sendo Classe

métodos são synchronized (não


evitada pois os seus mé
permite acesso concorrente aos dados do Vector).
Vector). Especializaç
Especialização

• A estrutura das classes de coleç


coleção (pacote java.
java.util)
util) está
está
Realizaç
Realização
colocada da seguinte forma:
Coleçções e Visibilidade - Alessandro Cerqueira - 20/8/2007

Collection
Object

Abstract List Set


Collection
Abstract
List
SortedSet
Abstract
ArrayList
Sequential List

LinkedList Vector HashSet TreeSet


Cole
16

Conceito de Interface
• Em Java e na UML, uma Interface:
– Se assemelha a uma classe abstrata
– Não apresenta atributos (somente constantes)
– Não apresenta có
código para os seus mé
métodos*
todos*
Coleçções e Visibilidade - Alessandro Cerqueira - 20/8/2007

– Possui somente as assinaturas dos mémétodos que deverão


ser codificados pelas classes que implementarem a
interface.*
interface.*
• Obs* - Se um mé
método não apresenta có
código é só possui a sua assinatura,
então ele é um método abstrato.
abstrato.
• Uma interface pode ser vista como a especificaç
especificação
de um serviç
serviço que pode ser realizado por uma ou mais
classes.
• Geralmente opta-
opta-se por uma interface (e não por uma classe
abstrata) quando não se sabe como implementar o serviç
serviço ou
quando o serviç
serviço pode ser implementado de vá
várias maneiras.
Cole
17

Conceito de Interface
• Realizaç
Realização Set
<<interface>>
– Relacionamento definido na UML e em Java que indica
que uma determinada classe iráirá realizar o serviç
serviço
especificado por uma interface.
interface. Em Java costumamos
Coleçções e Visibilidade - Alessandro Cerqueira - 20/8/2007

popularmente chamar a realizaç


realização de implementaç
implementação.
ão.
– Realizar (ou implementar)
implementar) uma interface significa que a
classe deverá
deverá implementar todos os mé métodos assinados
na interface.
interface. Se algum mé
método ficar de fora, o HashSet
compilador irá
irá considerar a classe abstrata.
abstrata.
– Uma classe pode implementar quantas interfaces
quiser.
– O conceito de polimorfismo se aplica aos objetos de
uma classe que implementam uma interface
– Ex:
public class HashSet implements Set { ... }
Cole

Assim objetos HashSet també


também podem ser vistos como objetos Set
18

Interface e Realização
Exemplo
1..*  produz 1

Limpador Fábrica
<<interface>>

limpar()
Coleçções e Visibilidade - Alessandro Cerqueira - 20/8/2007

Limpador de
Lava-
Lava-Jato Lava-
Lava-Louç
Louça
Pára-
ra-brisa
limpar() limpar() limpar()

Aspirador de Pó
Pó Lava-
Lava-Roupas

limpar() limpar()

OBS: É melhor deixar Limpador como Interface pois esta apresenta todas as caracterí
características de uma
interface e assim estamos livres para deixar as classes que implementam
implementam esta interface como
especializaç
especializações de uma outra classe (ex. Equipamento EléElétrico). Lembre-
Lembre-se que em Java uma classe
Cole

só pode ser especializaç


especialização direta de uma outra classe!
19

Interface e Realização
Exemplo
• Objetos Lava-
Lava-Jato,
Jato, Aspirador de Pó
Pó, Limpador de Pá
Pára-
ra-Brisa,
Brisa, Lava-
Lava-
Roupas e Lava-
Lava-Louç
Louça apresentam algumas propriedades em comum.
Todas são equipamentos produzidos por uma fá fábrica e que realizam o
serviç
serviço de limpeza.
limpeza. Suponha que a execuç
execução da limpeza seja executada
atravé
através do mé
método limpar().
limpar().
Coleçções e Visibilidade - Alessandro Cerqueira - 20/8/2007

• Para caracterizar que estas classes são limpadores, poderí


poderíamos criar
uma classe abstrata chamada Limpador com uma associaç
associação com
Fábrica e apresentando o mé
método limpar().
limpar().

• Entretanto, observe que a suposta classe Limpador não apresentaria


atributos e seu único mé
método é abstrato (a forma como cada classe irá
irá
implementar o mé
método limpar() é diferente e não conseguimos produzir
uma implementaç
implementação que valha para todas as suas especializaç
especializações).
Cole
20

Interface e Realização
Exemplo
• Assim, é melhor caracterizar a classe Limpador como interface pois
apresenta todas as caracterí
características da mesma e, assim, permitimos que
as suas realizaç
realizações possam ser especializaç
especializações de uma outra classe
(lembre-
(lembre-se que em Java não há há heranç
herança mú
múltipla).
Coleçções e Visibilidade - Alessandro Cerqueira - 20/8/2007

• Contudo, observe que na realizaç


realização há
há a presenç
presença da caracterí
característica do
polimorfismo;
polimorfismo; pois os objetos Fábrica vêem os objetos Lava-
Lava-Jato,
Jato,
Aspirador de Pó
Pó, Limpador de PáPára-
ra-Brisa,
Brisa, Lava-
Lava-Roupas e Lava-
Lava-Louç
Louça
como objetos da interface Limpador.
Limpador.
Cole
21

Interface e Realização
Exemplo (talvez um pouco mais lúdico)
Pessoa
Chorador cpf Carrasco
<<interface>> nome <<interface>>

chorar() endereç
endereço torturar()
Coleçções e Visibilidade - Alessandro Cerqueira - 20/8/2007

Polí
Político Aluno Professor Terrorista

chorar() chorar() torturar() torturar()


Cole
22

Codificando...
public interface Carrasco
{
public void torturar();
torturar();
}
Coleçções e Visibilidade - Alessandro Cerqueira - 20/8/2007

public class Aluno extends Pessoa implements Carrasco


{
...

public void torturar()


torturar()
{
System.
System.out.println
out.println(
(“Se não estudar, vou te reprovar!!!!
reprovar!!!!”
”);
}

...
}
Cole
23

Coleções no JDK 1.2


• Interface Collection
– Uma collection representa um serviç
serviço capaz de apontar para
um conjunto de objetos que não estão necessariamente
postos em uma ordem de posiç
posição arbitrada pelo
programador e que pode apresentar duplicaç
duplicações.
ões.
Coleçções e Visibilidade - Alessandro Cerqueira - 20/8/2007

– Métodos Importantes:
Importantes:
boolean add(
add(Object o) boolean addAll(
addAll(Collection c)
void clear()
clear() boolean contains(
contains(Object o)
Iterator iterator()
iterator() boolean remove(
remove(Object o )
boolean removeAll(
removeAll(Collection c) int size()
size()

• Classe Abstrata AbstractCollection


– Superclasse de todas as coleç
coleções.
– É uma classe abstrata pois na realidade não implementa os
métodos previstos na interface Collection.
Collection.
Cole
24

Coleções no JDK 1.2


• Interface List
– Especializaç
Especialização de Collection;
Collection; Uma lista representa um serviç
serviço capaz
de apontar para um conjunto de objetos que estão colocados em
uma ordem de posiç
posição arbitrada pelo programador e que pode
apresentar duplicaç
duplicação de elementos.
elementos.
Coleçções e Visibilidade - Alessandro Cerqueira - 20/8/2007

– Assim, o programador determinar que elemento ficará


ficará na posiç
posição 0,
na posiç
posição 1, etc.
– Métodos Importantes:
Importantes:
Object get(int
get(int posicao)
posicao) int indexOf(
indexOf(Object o)
void add(int
add(int posicao,
posicao, Object o) boolean contains(
contains(Object o)
Object set(int
set(int posicao,
posicao, Object o) List subList(int
subList(int inicio, int fim)
 Alé métodos de Collection
Além dos mé
• Classe Abstrata AbstractList
– Superclasse para as listas.
Cole

– É uma classe abstrata pois não implementa os mé


métodos da interface
25

Coleções do JDK 1.2


• Classe ArrayList
– Implementaç realização) da interface List.
Implementação (ou realizaç List.
– Seu comportamento está
está baseado em possuir um array de
referências para Object que aponta para os elementos da lista.
– Se o tamanho do array for insuficiente:
Coleçções e Visibilidade - Alessandro Cerqueira - 20/8/2007

• Cria-
Cria-se um novo array com o tamanho maior;
• Copia-
Copia-se o conteú
conteúdo do antigo array para o novo;
• Descarta-
Descarta-se o antigo (sofrerá
(sofrerá o Garbage Collection).
Collection).
– Bom para recuperaç
recuperação aleató
aleatória por posiç
posição; “Ruim”
Ruim” para inserç
inserção
se realizar o redimensionamento do array a cada instante.
– Para melhorar o desempenho, podemos utilizar o mé
método
ensureCapacity(tamanho)
ensureCapacity(tamanho)
Cole
26

Coleções do JDK 1.2


• Classe LinkedList
– Seu comportamento está baseado em implementar
uma lista encadeada
Coleçções e Visibilidade - Alessandro Cerqueira - 20/8/2007

– Bom para inserção; “Ruim” para recuperação aleatória


por posição já que há a necessidade de navegação pela
lista. Entretanto, se a recuperação for iterativa (ou
seja, posição a posição) não há problemas.

• Classe Vector
– Comportamento igual ao do ArrayList porém o Vector é
synchronized; ou seja, não permite acesso concorrente.
Cole
27

Coleções no JDK 1.2


• Interface Set
Especialização de Collection; Um set representa um serviç
– Especializaç serviço capaz
de apontar para um conjunto de objetos que não estão
necessariamente colocados em uma ordem de posiçposição arbitrada
pelo programador e que não permite a duplicaç
duplicação de elementos.
elementos.
Coleçções e Visibilidade - Alessandro Cerqueira - 20/8/2007

– Métodos Importantes:
Importantes:
Os mesmos de Collection.

• Classe HashSet
– Implementaç
Implementação de Set. Para isto, utiliza internamente uma
HashMap.
HashMap.
– Métodos Importantes:
Importantes:
HashSet(int
HashSet(int capacidadeInicial)
capacidadeInicial)
HashSet(int
HashSet(int capacidadeInicial,
capacidadeInicial, float fatorDeCarga)
fatorDeCarga)
Cole
28

Iterator
• Objeto que permite a recuperação seqüencial dos
elementos de uma coleção.
Collection colecao;
colecao;
Coleçções e Visibilidade - Alessandro Cerqueira - 20/8/2007

...
for(
for(Iterator it = colecao.
colecao.iterator()
iterator();
; it.hasNext
it.hasNext()
();
; )
{
<Classe> elemento = (<Classe>
(<Classe>)it.
)it.next
next()
();
;
...
}

– Métodos Importantes:
Importantes:
boolean hasNext(
hasNext( )  Informa se o iterator ainda pode retornar algum
elemento
Object next()
next()  Retorna o pró
próximo elemento da iteraç
iteração
Cole
29

Coleções no JDK 1.2


• Interface SortedSet
Especialização de Set; Um SortedSet representa um serviç
– Especializaç serviço capaz de
apontar para um conjunto de objetos sem duplicaç
duplicações cujos elementos
estão dispostos ordenadamente segundo algum crité
critério especificado.
– Para viabilizar a ordenaç
ordenação, é necessá
necessário que o SortedSet saiba o crité
critério
Coleçções e Visibilidade - Alessandro Cerqueira - 20/8/2007

para ordenaç
ordenação.
ão. Para especificaç
especificação do crité
critério, devemos fazer com que os
elementos do SortedSet implementem a interface Comparable ou
passarmos para o SortedSet um objeto que implemente a interface
Comparator.
Comparator.
– Métodos Importantes:
Importantes:
Os mesmos de Set.

• Classe TreeSet
– Implementa um SortedSet cuja complexidade de ordenaç
ordenação é Log(n)
Log(n)
– Métodos Importantes:
Importantes:
TreeSet( )  Os elementos deverão implementar Comparable
TreeSet(
TreeSet(
TreeSet(Comparator comparador)  Utiliza um comparador para
Cole

estabelecer a ordem
30

Comparable
• Se ao criar um TreeSet não indicamos um Comparator,
Comparator, ele
considerará
considerará que as classes de seus elementos implementam a
interface Comparable.
Comparable.
– Interface Comparable
Coleçções e Visibilidade - Alessandro Cerqueira - 20/8/2007

• int compareTo(Object o)
– Se o objeto que receber a mensagem (this
(this)) é igual ao
objeto recebido como parâmetro, então o mé
método deve
retornar 0 (Zero)
– Se o objeto que receber a mensagem (this
(this)) vem primeiro
que o objeto recebido como parâmetro, então o mé método
deve retornar um número negativo.
negativo.
– Se o objeto que receber a mensagem (this)
this) vem depois
que o objeto recebido como parâmetro, então o mé método
deve retornar um número positivo.
positivo.
Cole
31

Comparable
• Exemplo de Comparação com Strings
public class Empregado implements Comparable
{
Coleçções e Visibilidade - Alessandro Cerqueira - 20/8/2007

private String nome;


nome;
...
public int compareTo(
compareTo(Object o)
{
if(o
if(o instanceof Empregado)
Empregado)
{
Empregado e = (Empregado)o
(Empregado)o;
return this.
this.nome.
nome.compareTo(
compareTo(e.nome);
nome);
}
return –1;
}
}
A classe String també
também é uma realizaç
realização de Comparable!
Comparable!
Cole
32

Comparable
• Exemplo de Comparação Numérica
public class Empregado implements Comparable
{
Coleçções e Visibilidade - Alessandro Cerqueira - 20/8/2007

private int idade;


idade;
...
public int compareTo(
compareTo(Object o)
{
if(
if(o instanceof Empregado)
Empregado)
{
Empregado e = (Empregado)o
(Empregado)o;
return this.
this.idade - e.idade;
idade;
}
return –1;
}
}
Cole
33

Erros Vinculados à
implementação do Comparable
• Se em uma classe colocarmos a indicação
“implements Comparable” mas não adicionarmos
o método “compareTo”, o compilador acusará erro.
Coleçções e Visibilidade - Alessandro Cerqueira - 20/8/2007

• Da mesma forma, não adianta colocar o método


“compareTo” e não colocarmos a indicação
“implements Comparable”, pois quando o
TreeSet utiliza o critério do Comparable, ele só
permite que sejam adicionados Objetos que sejam
Comparable. Assim, este erro só será percebido em
tempo de execução.
Cole
34

Comparator
• Se ao criar um TreeSet passamos um Comparator,
Comparator, este
determinará
determinará a ordem dos elementos utilizando o mé
método
compare.
compare.
– Interface Comparator
Coleçções e Visibilidade - Alessandro Cerqueira - 20/8/2007

• int compare(Object o1, Object o2)


– Se o objeto que receber a mensagem (this
(this)) é igual ao
objeto recebido como parâmetro, então o mé
método deve
retornar 0 (Zero)
– Se o objeto que receber a mensagem (this
(this)) vem primeiro
que o objeto recebido como parâmetro, então o mé método
deve retornar um número negativo.
negativo.
– Se o objeto que receber a mensagem (this)
this) vem depois
que o objeto recebido como parâmetro, então o mé método
deve retornar um número positivo.
positivo.
Cole
35

Comparator
• Exemplo de Comparator
public class ComparadorPorNome implements Comparator
{
Coleçções e Visibilidade - Alessandro Cerqueira - 20/8/2007

public int compare(Object


compare(Object o1,
o1, Object o2)
o2)
{
if(o1
if(o1 instanceof Empregado &&
o2 instanceof Empregado)
{
Empregado e1 = (Empregado)o1
(Empregado)o1;;
Empregado e2 = (Empregado)o2
(Empregado)o2;;
return e1.getNome
e1.getNome()
().
.compareTo(
compareTo(e2.getNome
e2.getNome()
());
);
}
return –1;
}
}
Cole
36

Operador instanceof
• Se quisermos testar um atributo ou variá
variável local declarado
como ponteiro para um objeto de uma superclasse está está
propriamente apontando para um objeto de uma de suas
subclasses,
subclasses, devemos utilizar o operador instanceof.
instanceof.
Coleçções e Visibilidade - Alessandro Cerqueira - 20/8/2007

// Elemento foi declarado como ponteiro para um


// objeto da classe Object
Object elemento = coleç
coleção.get
ão.get(posi
(posiç
ção);
// Para sabermos se elemento na realidade está
está apontando
// para um objeto da classe String (subclasse), devemos
// utilizar o operador instanceof
if(elemento
if(elemento instanceof String)
{
...
}
Cole
37

Casting e instanceof
• Observe que nos có
códigos exibidos temos a presenç
presença da seguinte linha:
Empregado e = (Empregado)o
(Empregado)o;
• Por que há
há a necessidade de colocarmos (Empregado)?
Coleçções e Visibilidade - Alessandro Cerqueira - 20/8/2007

• Java é uma linguagem fortemente tipada!


tipada!
– Há intensa verificaç
verificação dos tipos feita pelo compilador nas operaç
operações que
codificamos.
– No caso de atribuiç
atribuições, o compilador verificará
verificará se o tipo à direita é igual
ou compatí
compatível com o tipo à esquerda
• Ex: int a = false;
false;// O tipo à direita (boolean
(boolean)
) não é igual nem
// compatí
compatível com o tipo à esquerda (int)
– A verificaç
verificação també
também é feita na passagem de parâmetros (o tipo do
parâmetro deve ser igual ou compatí
compatível com o especificado no
método).
todo).
• Observe que no cócódigo, o tipo de o (elemento à direita) é “ponteiro
Object” e o tipo de e (elemento à esquerda)
para um objeto da classe Object”
é “ponteiro para um objeto da classe Empregado”
Empregado”.
Cole
38

Casting e instanceof
• Neste caso, o tipo à direita não é igual nem compatí
(Continuaçção)
(Continua compatível com o
tipo à esquerda (nem sempre um ponteiro para Object estáestá
apontando para um Empregado).
• Mas, por causa do teste realizado previamente com o instanceof,
instanceof,
Coleçções e Visibilidade - Alessandro Cerqueira - 20/8/2007

sabemos que o (ponteiro para Object)


Object) aponta para um objeto
Empregado.
Empregado.
• Para o compilador não reclamar da operaç
operação (Type
(Type Mismatch – tipo
incompatí
incompatível),
vel), devemos solicitar que ele veja somente neste instante
o ponteiro para Object como ponteiro para Empregado.
Empregado. A esta
operaç
operação denominamos de casting.
casting.
• Se por acaso o não estivesse apontando para um Empregado, a JVM
lanç
lançaria uma exceç
exceção chamada ClassCastException que abortaria a
execuç
execução do programa.
Cole
39

Casting e instanceof
• Sempre precisaremos de indicar um casting na recuperaç
recuperação de elementos, pois
todos os mé
métodos de recuperaç
recuperação foram codificados para retornar uma referência
para Object. Poré
Porém, na maioria das vezes, sabemos que eles pertencem a uma
especialização de Object.
especializaç

• Observe o seguinte caso:


Coleçções e Visibilidade - Alessandro Cerqueira - 20/8/2007

String str = coleç


coleção.get
ão.get(posi
(posiçção);

ptr para String ptr para Object

• O compilador irá
irá acusar erro pois o tipo à direita não é igual nem compatí
compatível com
o tipo à esquerda. Mas se soubermos que Coleç
Coleção.get
ão.get(posi
(posiçção) sempre retornará
retornará
através de um Casting.
uma String, devemos avisar isto para o compilador atravé Casting.
String str = (String) coleç
coleção.get
ão.get(posi
(posiçção);
• Dica para o uso do casting em atribuições
– Se o tipo da direita não é igual ou compatí
compatível com o tipo da
esquerda, deveremos utilizar o Casting.
Casting.
Cole
40

Coleções
Implementando Classes de Associação
• Devemos substituir a modelagem proposta pela implementaç
implementação
de duas associaç
associações ligando a classe de associaç
associação com as
classes envolvidas no relacionamento.
Coleçções e Visibilidade - Alessandro Cerqueira - 20/8/2007

• No exemplo abaixo, apesar de termos modelado a associaç


associação
“Envolve a Venda de”
de”, vamos substitui-
substitui-la pelas associaç
associações em
vermelho. Observe que as cardinalidades das extremidades são
uná
unárias e que as cardinalidades na classe de associaç
associação são
trocadas em relaç
relação ao que existia antes (em azul).
azul).
0..* Envolve a Venda de  1..*
Nota Fiscal Produto
Número CódBarras
Data Nome

1
Item 1
NumItens
1..* PreçoUnitário 0..*
Cole
41

Classe Collections
• É uma classe que conté
contém vá
vários mé
métodos está
estáticos que fazem a
manipulaç
manipulação dos objetos de coleç
coleção.
– Métodos Importantes:
Importantes:
static void copy(
copy(List l1, List l2)
static void reverse(
reverse(List l)
Coleçções e Visibilidade - Alessandro Cerqueira - 20/8/2007

static void sort(


sort(List l)
static void sort(
sort(List l, Comparator cmp)
static Collection unmodifiableCollection(
unmodifiableCollection(Collection c)
static List unmodifiableList(
unmodifiableList(List c)
static Collection synchronizedCollection(
synchronizedCollection(Collection c)
static List synchronizedList(
synchronizedList(List c)

Exemplo:
ArrayList lista = new ArrayList();
ArrayList();
...
Collections.
Collections.sort(lista);
sort(lista); // Promoverá
Promover á a ordenaç
ordenação da lista atravé
atrav és de Comparable
Comparable´
´s

• Coleç
Coleções Synchronized
– São aquelas que sósó podem ser manipuladas por uma única Thread a cada
instante. A única exceç
exceção é a recuperaç
recuperação via iterator.
iterator.
Cole
42

Coleções no JDK 1.2


• Classe Hashtable
– Não está
está vinculada a interface Collection (implementa
na realidade a interface Map)
Map)
– Funciona como uma tabela Hash.
Hash. Para adicionarmos
Map
um elemento, temos que vincular a ele uma chave de
Coleçções e Visibilidade - Alessandro Cerqueira - 20/8/2007

indexaç
indexação que é utilizada para a recuperaç
recuperação.
• public void put(
put(Object chave, Object elemento)
– Insere um elemento no Hashtable indexando-
indexando-o
pela chave passada.
Dictionary
• public Object get(
get(Object chave)
– Recupera o elemento indexado no Hashtable pela
chave fornecida.
– A posiç
posição de um elemento é determinada por sua
funç
função hash.
hash. Em Java, todo objeto possui o mé
método
hashCode() e este é utilizado como funç
função hash.
hash. Hashtable

– Como Hashtable é synchronized, é melhor utilizar a


classe HashMap.
HashMap. HashMap
Cole
43

Hashtable
Exemplo
• Se enviarmos a mensagem get(get(“12345678-
12345678-90”
90”) para o
Hashtable,
Hashtable, ele nos dará
dará uma referência para o objeto
Empregado “José”
José”..
String
Empregado
Hashtable “12345678-
12345678-90”
90”
cpf:
cpf:
Coleçções e Visibilidade - Alessandro Cerqueira - 20/8/2007

tabela:
nome:
String
depto:
“José
José ”
Chaves Objetos
String
“12345678
12345678--90
90”” String
Empregado
“09876543-
09876543-21”
21”
String cpf:
cpf:
“09876543
09876543--21
21””
nome:
String
depto:
“Maria”
Maria”
Cole
44

Coleções no JDK 1.2


– Outros Métodos Importantes de Hashtable:
Hashtable()
Hashtable()
Hashtable(int
Hashtable(int capacidadeInicial)
capacidadeInicial)
Coleçções e Visibilidade - Alessandro Cerqueira - 20/8/2007

Hashtable(int
Hashtable(int capacidadeInicial,
capacidadeInicial, float fatorDeCarga)
fatorDeCarga)
boolean containsValue(
containsValue(Object o)
boolean containsKey(
containsKey(Object o)
Set keySet()
keySet()
Collection values()
values()

remove(Object key)
Object remove(

– Hashtable é uma classe synchronized. Prefira a


classe HashMap.
Cole