32
Aula 4 A infra-estrutura aplicacional de colecções do Java (Java Collections Framework)

Programação Orientada por Objectos - Aula 4

Embed Size (px)

DESCRIPTION

Aula teórica 4 da unidade (disciplina) de Programação Orientada por Objectivos para os cursos de LIGE, LEI e LETI no ISCTE-IUL no 2.º semestre do ano lectivo de 2009/2010.

Citation preview

Page 1: Programação Orientada por Objectos - Aula 4

Aula 4

A infra-estrutura aplicacional de colecções do Java(Java Collections Framework)

Page 2: Programação Orientada por Objectos - Aula 4

Na aula anterior…

Interfaces Listas e listas ligadas Iteradores

2009/2010 Programação Orientada por Objectos 2

Page 3: Programação Orientada por Objectos - Aula 4

Infra-estrutura aplicacional de colecções do Java

Infra-estrutura aplicacional englobando interfaces, classes abstractas e concretas, e algoritmos que disponibilizam vários tipos de colecção em Java

Colecções Agregados estruturados de elementos Cada tipo de colecção tem propriedades

específicas Têm diferentes eficiências a realizar operações

equivalentes2009/2010 Programação Orientada por Objectos 3

Java Collections Framework (JCF)

Page 4: Programação Orientada por Objectos - Aula 4

JCF: tipos de colecção

Tipo Natureza Repetições

Ordenado

Tipo de ordem

Set<E> Conjunto não ? se sim, intrínsecaList<E> Sequência sim sim extrínsecaQueue<E> Fila de espera sim sim ?Stack<E> Pilha sim sim extrínsecaMap<K,V> Mapeia chaves

em valoresnão (chaves)sim (valores)

? se sim, intrínseca (chave)

2009/2010 Programação Orientada por Objectos 4

Legenda:E – tipo dos elementosK – tipo das chaves de um mapaV – tipo dos valores de um mapa? – característica depende do tipo concretoIntrínseca – Ordem depende do valor dos elementos (ou da chave)Extrínseca – Ordem depende da forma de inserção e remoção dos elementos.

Page 5: Programação Orientada por Objectos - Aula 4

“Uma colecção é iterável.”

“Um conjunto ordenado é um conjunto.”

JCF: principais interfaces

2009/2010 Programação Orientada por Objectos 5

«interface»

Iterable

«interface»

Collection

«interface»Set

«interface»

List

«interface»

SortedSet

«interface»

Queue

«interface»

Deque

«interface»

SortedMap

«interface»Map

E

E

E

E

E

E

E

K,V

K,V

Page 6: Programação Orientada por Objectos - Aula 4

JFC: estruturas de dados subjacentes

Nome Nome (inglês)

Descrição

Matriz Array Sequência de elementos contíguos em memória, com indexação muito rápida mas inserção de novos elementos lenta (excepto nos extremos quando não é necessário um aumento da capacidade).

Cadeia (ou lista ligada)

Linked list

Sequência de elementos ligados, com indexação e pesquisa lentos mas inserção rápida em qualquer local.

Árvore Tree Sequência de elementos organizados em árvore, com todas as operações essenciais razoavelmente rápidas.

Tabela de endereçamento calculado

Hash(ing) table

Elementos espalhados em matriz usando índices obtidos aplicando-lhes uma função de endereçamento, com todas as operações essenciais muito rápidas (troca mais velocidade por maior consumo de memória).

2009/2010 Programação Orientada por Objectos 6

Page 7: Programação Orientada por Objectos - Aula 4

JCF: elementos, chaves e valores Têm de implementar

boolean equals(Object another) int hashCode()

Operações são fornecidas pela classe Object!

Podem ser sobrepostas (com cuidado) Se one.equals(another)então one.hashCode() == another.hashCode()

Outras restrições2009/2010 Programação Orientada por Objectos 7

Para procurar.

Para tabelas de endereçamento calculado.

Page 8: Programação Orientada por Objectos - Aula 4

JCF: classes concretas

Tipo Estrutura de dados Restrições adicionaisArrayList<E> Matriz -Vector<E> Matriz -LinkedList<E> Cadeia ligada -ArrayDeque<E> Matriz -Stack<E> Matriz (via Vector) -PriorityQueue<E> Matriz (organizada como

árvore)E implementa Comparable<E>

TreeSet<E> Árvore E implementa Comparable<E>

TreeMap<K,V> Árvore K implementa Comparable<K>

HashSet<E> Tabela de endereçamento calculado

-

HashMap<K,V> Tabela de endereçamento calculado

-2009/2010 Programação Orientada por Objectos 8

Page 9: Programação Orientada por Objectos - Aula 4

JCF: classes concretas

2009/2010 Programação Orientada por Objectos 9

«interface»RandomAccess

ArrayList

«interface»List

E «interface»

Queue

E

VectorE

LinkedListE

EPriorityQueue

E

StackE

«interface»

Deque

E

ArrayDequeE

Page 10: Programação Orientada por Objectos - Aula 4

JCF: classes concretas

2009/2010 Programação Orientada por Objectos 10

«interface»Set

E

HashSetE «interface

»SortedSet

E

TreeSetE

«interface»Map

K,V

HashMap«interface

»SortedMap

TreeMap

K,V

K,V

K,V

LinkedHashMapK,V

LinkedHashSetK,V

Page 11: Programação Orientada por Objectos - Aula 4

JCF: one.compareTo(another)

Relação entre one e another

Resultado da operação

one < another < 0

one = another = 0

one > another > 0

2009/2010 Programação Orientada por Objectos 11

Page 12: Programação Orientada por Objectos - Aula 4

JCF: Boas práticas

Classe implementa compareTo? Então é de valor

Logo, deve sobrepor a sua especialização de equals…

…pois por omissão equals compara identidade e não igualdade!

As operações compareTo e equals devem ser consistentes…

…ou seja, one.compareTo(another) == 0 deve resultar no mesmo que one.equals(another)

2009/2010 Programação Orientada por Objectos 12

Page 13: Programação Orientada por Objectos - Aula 4

public class Rational implements Comparable<Rational> { private final int numerator; private final int denominator; …

public int compareTo(final Rational another){ return getNumerator() * another.getDenominator() - another.getNumerator() * getDenominator(); }

…}

Aplicação à classe Rational

2009/2010 Programação Orientada por Objectos 13

«interface»Comparable<T →

Rational>

Rational

Page 14: Programação Orientada por Objectos - Aula 4

public class Rational implements Comparable<Rational> { …

public boolean equals(final Object obj) { if (this == obj) return true; if (obj == null || getClass() != obj.getClass()) return false;

final Rational other = (Rational) obj;

return denominator == other.denominator && numerator == other.numerator; }

…}

Aplicação à classe Rational

2009/2010 Programação Orientada por Objectos 14

Page 15: Programação Orientada por Objectos - Aula 4

public class Rational implements Comparable<Rational> { private final int numerator; private final int denominator; …

public int hashCode() { return (getNumerator() + getDenominator()) * (getNumerator() + getDenominator() + 1) + getDenominator(); }

…}

Aplicação à classe Rational

2009/2010 Programação Orientada por Objectos 15

Page 16: Programação Orientada por Objectos - Aula 4

JCF: List e ArrayList

final List<Course> courses = new ArrayList<Course>();

final Course Ip = new Course("IP");final Course Poo = new Course("POO");

courses.add(Ip); // adiciona ao fimcourses.add(Poo);

int indexOfCourseToRemove = -1;

for (int i = 0; i != courses.size(); i++) if (courses.get(i) == Poo) indexOfCourseToRemove = i;

if (indexOfCourseToRemove != -1) courses.remove(indexOfCourseToRemove);courses.remove(Ip);

2009/2010 Programação Orientada por Objectos 16

Remoção fora do ciclo? O.K.Remoção dentro do ciclo? Bronca!

É comum usar um tipo mais genérico para aceder a uma colecção do que a classe real do objecto referenciado. Dessa forma pode-se alterar essa classe alterando apenas uma linha de código.

Fará sentido indexar uma lista? E se se mudar a classe real para LinkedList?

Page 17: Programação Orientada por Objectos - Aula 4

JCF: Vector

final Vector<Course> courses = new Vector<Course>();

final Course Ip = new Course("IP");final Course Poo = new Course("POO");

courses.add(Ip); // adiciona ao fimcourses.add(Poo);

for (int i = 0; i != courses.size(); i++) out.println(courses.get(i));

2009/2010 Programação Orientada por Objectos 17

Page 18: Programação Orientada por Objectos - Aula 4

JCF: Stack

final Stack<Course> courses = new Stack<Course>();

final Course Ip = new Course("IP");final Course Poo = new Course("POO");

courses.push(Ip); // adiciona no topocourses.push(Poo);

while (!courses.isEmpty()) { out.println(courses.peek()); courses.pop();}

2009/2010 Programação Orientada por Objectos 18

Page 19: Programação Orientada por Objectos - Aula 4

JCF: List, LinkedList e Iterator

final List<Course> courses = new LinkedList<Course>();…final Course Esi = new Course("ES I");…

final Iterator<Course> iterator = courses.iterator();

while (iterator.hasNext()) { Course course = iterator.next(); if (course == Esi) iterator.remove();}

2009/2010 Programação Orientada por Objectos 19

Remoção segura: É removido o último elemento devolvido por next().

Dois em um: avança e devolve. Muito discutível!

Page 20: Programação Orientada por Objectos - Aula 4

JCF: LinkedList e Queue

final Queue<Course> courses = new LinkedList<Course>();

final Course Ip = new Course("IP");final Course Poo = new Course("POO");

courses.add(Ip); // adiciona ao iníciocourses.add(Poo); // adiciona ao início

out.println(courses.element());out.println(courses.element());

final Iterator<Course> iterator = courses.iterator();

while (iterator.hasNext()) { Course course = iterator.next(); out.println(course);}

2009/2010 Programação Orientada por Objectos 20

Mais uma vez, dois em um…

Page 21: Programação Orientada por Objectos - Aula 4

JCF: LinkedList e Deque

final Deque<Course> courses = new LinkedList<Course>();

final Course Ip = new Course("IP");final Course Poo = new Course("POO");

courses.addFirst(Ip); // adiciona ao iníciocourses.addLast(Poo); // adiciona ao fim

out.println(courses.getFirst());out.println(courses.getLast());

final Iterator<Course> iterator = courses.iterator();

while (iterator.hasNext()) { Course course = iterator.next(); out.println(course);}

2009/2010 Programação Orientada por Objectos 21

Mais uma vez, dois em um…

Page 22: Programação Orientada por Objectos - Aula 4

Ciclo for-each

final List<Course> courses = new LinkedList<Course>();

for (Course course : courses) out.println(course);

2009/2010 Programação Orientada por Objectos 22

Modo de iteração compacto, sem usar iterador, mas … de utilização limitada (não se pode alterar a colecção, não se pode facilmente percorrer subsequências da colecção, etc.).

Page 23: Programação Orientada por Objectos - Aula 4

JCF: Iteração e alteração concorrentes

final List<Course> courses = new LinkedList<Course>();…final Course Poo = new Course(“POO");…

for (Course course : courses) { courses.remove(Poo); out.println(course);}

2009/2010 Programação Orientada por Objectos 23

Alterações durante o ciclo produzem resultados inesperados. Pode mesmo ser lançada a excepção ConcurrentModificationException.

Page 24: Programação Orientada por Objectos - Aula 4

JCF: Map e HashMap

final Map<String, Course> courses = new HashMap<String, Course>();…courses.put("IP", new Course("Introdução à …"));…

if (courses.containsKey("IP")) out.println(courses.get("IP"));

for (String key : courses.keySet()) out.println(key);

for (Map.Entry<String, Course> entry : courses.entrySet()) out.println(entry);

for (Course course : courses.values()) out.println(course);

2009/2010 Programação Orientada por Objectos 24

Page 25: Programação Orientada por Objectos - Aula 4

JCF: Map e TreeMap

final Map<String, Course> courses = new TreeMap<String, Course>();…courses.put("IP", new Course("Introdução à …"));…

if (courses.containsKey("IP")) out.println(courses.get("IP"));

for (String key : courses.keySet()) out.println(key);

for (Map.Entry<String, Course> entry : courses.entrySet()) out.println(entry);

for (Course course : courses.values()) out.println(course);

2009/2010 Programação Orientada por Objectos 25

Page 26: Programação Orientada por Objectos - Aula 4

JCF: Queue e LinkedList

Queue<String> courseNames = new LinkedList<String>();

courseNames.add("POO");courseNames.add("ES I");courseNames.add("IP");

while(!courseNames.isEmpty()) { out.println(courseNames.element()); courseNames.remove();}

2009/2010 Programação Orientada por Objectos 26

Page 27: Programação Orientada por Objectos - Aula 4

JCF: Queue e PriorityQueue

Queue<String> courseNames = new PriorityQueue<String>();

courseNames.add("POO");courseNames.add(“ES I");courseNames.add("IP");

while(!courseNames.isEmpty()) { out.println(courseNames.element()); courseNames.remove();}

2009/2010 Programação Orientada por Objectos 27

Page 28: Programação Orientada por Objectos - Aula 4

JCF: Boas práticas na utilização de colecções

Não usar colecções de Object

Usar o tipo de colecção mais adequado

Atentar na diferente eficiência das mesmas operações em diferentes tipos de colecção (consultar a documentação)

Não alterar uma colecção durante uma iteração ao longo dos elementos (ou usar o iterador para o fazer)

2009/2010 Programação Orientada por Objectos 28

Page 29: Programação Orientada por Objectos - Aula 4

JCF: Boas práticas na utilização de colecções

Alteração de elementos de colecções com ordem intrínseca pode ter efeitos inesperados

Usar sempre classes (de valor) imutáveis quando for necessária ordem intrínseca

Ter atenção à documentação: nem todas as colecções permitem a inserção de elementos nulos

2009/2010 Programação Orientada por Objectos 29

Page 30: Programação Orientada por Objectos - Aula 4

A reter…

A JCF é uma infra-estrutura aplicacional englobando interfaces, classes abstractas e concretas, e algoritmos que disponibilizam vários tipos de colecção em Java

As colecções são agregados estruturados de elementos, tendo cada tipo de colecção propriedades específicas, particularmente quanto à eficiência com que realiza cada operação

Para usar bem estas classes é necessário conhecer bem a documentação!

2009/2010 Programação Orientada por Objectos 30

Page 31: Programação Orientada por Objectos - Aula 4

A ler para a próxima aula…

Secção 18.6 do livro:

Y. Daniel Liang, Introduction to Java Programming, 7.ª edição, Prentice-Hall, 2008.ISBN: 978-0-13-605966-0

2009/2010 Programação Orientada por Objectos 31

Page 32: Programação Orientada por Objectos - Aula 4

Aula 4: Sumário

A infra-estrutura aplicacional de colecções do Java (Java Collections Framework)

2009/2010 Programação Orientada por Objectos 32