Professional Documents
Culture Documents
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
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) ...
{ }
... ...
} }
...
}
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
• 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
// 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
}
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
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
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
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
Collection
Object
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
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
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
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
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
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
Codificando...
public interface Carrasco
{
public void torturar();
torturar();
}
Coleçções e Visibilidade - Alessandro Cerqueira - 20/8/2007
...
}
Cole
23
– 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()
• 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
• Classe Vector
– Comportamento igual ao do ArrayList porém o Vector é
synchronized; ou seja, não permite acesso concorrente.
Cole
27
– 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
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
Comparable
• Exemplo de Comparação Numérica
public class Empregado implements Comparable
{
Coleçções e Visibilidade - Alessandro Cerqueira - 20/8/2007
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
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
Comparator
• Exemplo de Comparator
public class ComparadorPorNome implements Comparator
{
Coleçções e Visibilidade - Alessandro Cerqueira - 20/8/2007
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
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
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
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ç
• 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
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
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
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
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
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(