SlideShare une entreprise Scribd logo
1  sur  32
Aula 4 A infra-estrutura aplicacional de colecções do Java (Java Collections Framework)
Na aula anterior… Interfaces Listas e listas ligadas Iteradores 2009/2010 Programação Orientada por Objectos 2
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 equivalentes 2009/2010 Programação Orientada por Objectos 3 Java Collections Framework (JCF)
JCF: tipos de colecção 2009/2010 Programação Orientada por Objectos 4 Legenda: E – tipo dos elementos K – tipo das chaves de um mapa V – tipo dos valores de um mapa ? – característica depende do tipo concreto Intrínseca – Ordem depende do valor dos elementos (ou da chave) Extrínseca – Ordem depende da forma de inserção e remoção dos elementos.
JCF: principais interfaces 2009/2010 Programação Orientada por Objectos 5 E E «interface» Iterable «interface» Collection E K,V E E «interface» Set «interface» List «interface» Queue «interface» Map “Um conjunto ordenado é um conjunto.” “Uma colecção é iterável.” E E K,V «interface» SortedSet «interface» Deque «interface» SortedMap
JFC: estruturas de dados subjacentes 2009/2010 Programação Orientada por Objectos 6
JCF: elementos, chaves e valores Têm de implementar booleanequals(Objectanother) inthashCode() 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ções 2009/2010 Programação Orientada por Objectos 7 Para procurar. Para tabelas de endereçamento calculado.
JCF: classes concretas 2009/2010 Programação Orientada por Objectos 8
JCF: classes concretas 2009/2010 Programação Orientada por Objectos 9 E E «interface» RandomAccess «interface» List «interface» Queue E «interface» Deque E E E ArrayList Vector PriorityQueue E E E LinkedList ArrayDeque Stack
JCF: classes concretas 2009/2010 Programação Orientada por Objectos 10 E K,V «interface» Set «interface» Map E K,V E K,V «interface» SortedSet «interface» SortedMap HashMap HashSet E K,V K,V K,V TreeSet TreeMap LinkedHashMap LinkedHashSet
JCF: one.compareTo(another) 2009/2010 Programação Orientada por Objectos 11
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
public class Rational implements Comparable<Rational> {     private final int numerator;     private final int denominator;     …     public intcompareTo(final Rational another){         return getNumerator() * another.getDenominator()              - another.getNumerator() * getDenominator();     }     … } Aplicação à classe Rational 2009/2010 Programação OrientadaporObjectos 13 «interface» Comparable<T->Rational> Rational
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 OrientadaporObjectos 14
public class Rational implements Comparable<Rational> {     private final int numerator;     private final int denominator;     …     public inthashCode() {         return (getNumerator() + getDenominator())              * (getNumerator() + getDenominator() + 1)              + getDenominator();     }     … } Aplicação à classe Rational 2009/2010 Programação OrientadaporObjectos 15
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 fim courses.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 É 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? Remoção fora do ciclo? O.K. Remoção dentro do ciclo? Bronca!
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 fim courses.add(Poo); for (int i = 0; i != courses.size(); i++)     out.println(courses.get(i)); 2009/2010 Programação Orientada por Objectos 17
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 topo courses.push(Poo); while (!courses.isEmpty()) {     out.println(courses.peek());     courses.pop(); } 2009/2010 Programação Orientada por Objectos 18
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 Dois em um: avança e devolve. Muito discutível! Remoção segura: É removido o último elemento devolvido por next().
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); // adicionaaoinício courses.add(Poo); // adicionaaoiní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…
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); // adicionaaoinício courses.addLast(Poo); // adicionaaofim 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…
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.).
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.
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
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
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
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
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
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
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
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
Aula 4: Sumário A infra-estrutura aplicacional de colecções do Java (Java Collections Framework) 2009/2010 Programação Orientada por Objectos 32

Contenu connexe

En vedette (7)

Collection Java (2/2)
Collection Java (2/2)Collection Java (2/2)
Collection Java (2/2)
 
Equals, Hashcode, ToString, Comparable e Comparator
Equals, Hashcode, ToString, Comparable e ComparatorEquals, Hashcode, ToString, Comparable e Comparator
Equals, Hashcode, ToString, Comparable e Comparator
 
Collections Java (1/2)
Collections Java (1/2)Collections Java (1/2)
Collections Java (1/2)
 
Java 14
Java 14Java 14
Java 14
 
Introdução a Java IO
Introdução a Java IOIntrodução a Java IO
Introdução a Java IO
 
Java collections-basic
Java collections-basicJava collections-basic
Java collections-basic
 
Java 12 Colecoes
Java 12 ColecoesJava 12 Colecoes
Java 12 Colecoes
 

Similaire à Programação Orientada por Objectos - Aula 4

[CLPE] Design patterns com c#
[CLPE] Design patterns com c#[CLPE] Design patterns com c#
[CLPE] Design patterns com c#
Felipe Pimentel
 
2 funcoes e estrutura de blocos
2   funcoes e estrutura de blocos2   funcoes e estrutura de blocos
2 funcoes e estrutura de blocos
Ricardo Bolanho
 

Similaire à Programação Orientada por Objectos - Aula 4 (20)

Semana 10: Encapsulação, cópia de instâncias, igualdade de instâncias
Semana 10: Encapsulação, cópia de instâncias, igualdade de instânciasSemana 10: Encapsulação, cópia de instâncias, igualdade de instâncias
Semana 10: Encapsulação, cópia de instâncias, igualdade de instâncias
 
Usando POP com Programação Funcional
Usando POP com Programação FuncionalUsando POP com Programação Funcional
Usando POP com Programação Funcional
 
ESTRUTURA DE DADOS (JAVA) AULA 09
ESTRUTURA DE DADOS (JAVA) AULA 09ESTRUTURA DE DADOS (JAVA) AULA 09
ESTRUTURA DE DADOS (JAVA) AULA 09
 
Programação Orientada por Objectos - Aula 7
Programação Orientada por Objectos - Aula 7Programação Orientada por Objectos - Aula 7
Programação Orientada por Objectos - Aula 7
 
[CLPE] Design patterns com c#
[CLPE] Design patterns com c#[CLPE] Design patterns com c#
[CLPE] Design patterns com c#
 
Refatoração de código com Capitão Nascimento versão completa
Refatoração de código com Capitão Nascimento versão completaRefatoração de código com Capitão Nascimento versão completa
Refatoração de código com Capitão Nascimento versão completa
 
PHP 5.3 - Funções
PHP 5.3 - FunçõesPHP 5.3 - Funções
PHP 5.3 - Funções
 
10. Encapsulação; Cópia de instâncias; Igualdade de instâncias – Fundamentos ...
10. Encapsulação; Cópia de instâncias; Igualdade de instâncias – Fundamentos ...10. Encapsulação; Cópia de instâncias; Igualdade de instâncias – Fundamentos ...
10. Encapsulação; Cópia de instâncias; Igualdade de instâncias – Fundamentos ...
 
2 funcoes e estrutura de blocos
2   funcoes e estrutura de blocos2   funcoes e estrutura de blocos
2 funcoes e estrutura de blocos
 
Semana 9: toString, classes, instâncias e objectos, Scanner
Semana  9: toString, classes, instâncias e objectos, ScannerSemana  9: toString, classes, instâncias e objectos, Scanner
Semana 9: toString, classes, instâncias e objectos, Scanner
 
Turbinando o desenvolvimento Android com Kotlin
Turbinando o desenvolvimento Android com KotlinTurbinando o desenvolvimento Android com Kotlin
Turbinando o desenvolvimento Android com Kotlin
 
5. Atribuições especiais; Arrays; Tipos de ciclos; Classes-pacote – Fundament...
5. Atribuições especiais; Arrays; Tipos de ciclos; Classes-pacote – Fundament...5. Atribuições especiais; Arrays; Tipos de ciclos; Classes-pacote – Fundament...
5. Atribuições especiais; Arrays; Tipos de ciclos; Classes-pacote – Fundament...
 
Aula5
Aula5Aula5
Aula5
 
Programando Melhor - Flisol
Programando Melhor - FlisolProgramando Melhor - Flisol
Programando Melhor - Flisol
 
Programação Orientada por Objectos - Aula 2
Programação Orientada por Objectos - Aula 2Programação Orientada por Objectos - Aula 2
Programação Orientada por Objectos - Aula 2
 
TDC2018SP | Trilha Android - Assincronismo no Android, de RxJava a Coroutines
TDC2018SP | Trilha Android - Assincronismo no Android, de RxJava a CoroutinesTDC2018SP | Trilha Android - Assincronismo no Android, de RxJava a Coroutines
TDC2018SP | Trilha Android - Assincronismo no Android, de RxJava a Coroutines
 
Aula01
Aula01Aula01
Aula01
 
RevisãoCompactaFuncoesPonteiro.pptx
RevisãoCompactaFuncoesPonteiro.pptxRevisãoCompactaFuncoesPonteiro.pptx
RevisãoCompactaFuncoesPonteiro.pptx
 
Plataforma de compiladores .NET, C# 6 e Visual Studio 2015
Plataforma de compiladores .NET, C# 6 e Visual Studio 2015Plataforma de compiladores .NET, C# 6 e Visual Studio 2015
Plataforma de compiladores .NET, C# 6 e Visual Studio 2015
 
Algoritmos de ordenação
Algoritmos de ordenaçãoAlgoritmos de ordenação
Algoritmos de ordenação
 

Programação Orientada por Objectos - Aula 4

  • 1. Aula 4 A infra-estrutura aplicacional de colecções do Java (Java Collections Framework)
  • 2. Na aula anterior… Interfaces Listas e listas ligadas Iteradores 2009/2010 Programação Orientada por Objectos 2
  • 3. 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 equivalentes 2009/2010 Programação Orientada por Objectos 3 Java Collections Framework (JCF)
  • 4. JCF: tipos de colecção 2009/2010 Programação Orientada por Objectos 4 Legenda: E – tipo dos elementos K – tipo das chaves de um mapa V – tipo dos valores de um mapa ? – característica depende do tipo concreto Intrínseca – Ordem depende do valor dos elementos (ou da chave) Extrínseca – Ordem depende da forma de inserção e remoção dos elementos.
  • 5. JCF: principais interfaces 2009/2010 Programação Orientada por Objectos 5 E E «interface» Iterable «interface» Collection E K,V E E «interface» Set «interface» List «interface» Queue «interface» Map “Um conjunto ordenado é um conjunto.” “Uma colecção é iterável.” E E K,V «interface» SortedSet «interface» Deque «interface» SortedMap
  • 6. JFC: estruturas de dados subjacentes 2009/2010 Programação Orientada por Objectos 6
  • 7. JCF: elementos, chaves e valores Têm de implementar booleanequals(Objectanother) inthashCode() 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ções 2009/2010 Programação Orientada por Objectos 7 Para procurar. Para tabelas de endereçamento calculado.
  • 8. JCF: classes concretas 2009/2010 Programação Orientada por Objectos 8
  • 9. JCF: classes concretas 2009/2010 Programação Orientada por Objectos 9 E E «interface» RandomAccess «interface» List «interface» Queue E «interface» Deque E E E ArrayList Vector PriorityQueue E E E LinkedList ArrayDeque Stack
  • 10. JCF: classes concretas 2009/2010 Programação Orientada por Objectos 10 E K,V «interface» Set «interface» Map E K,V E K,V «interface» SortedSet «interface» SortedMap HashMap HashSet E K,V K,V K,V TreeSet TreeMap LinkedHashMap LinkedHashSet
  • 11. JCF: one.compareTo(another) 2009/2010 Programação Orientada por Objectos 11
  • 12. 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
  • 13. public class Rational implements Comparable<Rational> { private final int numerator; private final int denominator; … public intcompareTo(final Rational another){ return getNumerator() * another.getDenominator() - another.getNumerator() * getDenominator(); } … } Aplicação à classe Rational 2009/2010 Programação OrientadaporObjectos 13 «interface» Comparable<T->Rational> Rational
  • 14. 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 OrientadaporObjectos 14
  • 15. public class Rational implements Comparable<Rational> { private final int numerator; private final int denominator; … public inthashCode() { return (getNumerator() + getDenominator()) * (getNumerator() + getDenominator() + 1) + getDenominator(); } … } Aplicação à classe Rational 2009/2010 Programação OrientadaporObjectos 15
  • 16. 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 fim courses.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 É 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? Remoção fora do ciclo? O.K. Remoção dentro do ciclo? Bronca!
  • 17. 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 fim courses.add(Poo); for (int i = 0; i != courses.size(); i++) out.println(courses.get(i)); 2009/2010 Programação Orientada por Objectos 17
  • 18. 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 topo courses.push(Poo); while (!courses.isEmpty()) { out.println(courses.peek()); courses.pop(); } 2009/2010 Programação Orientada por Objectos 18
  • 19. 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 Dois em um: avança e devolve. Muito discutível! Remoção segura: É removido o último elemento devolvido por next().
  • 20. 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); // adicionaaoinício courses.add(Poo); // adicionaaoiní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…
  • 21. 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); // adicionaaoinício courses.addLast(Poo); // adicionaaofim 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…
  • 22. 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.).
  • 23. 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.
  • 24. 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
  • 25. 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
  • 26. 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
  • 27. 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
  • 28. 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
  • 29. 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
  • 30. 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
  • 31. 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
  • 32. Aula 4: Sumário A infra-estrutura aplicacional de colecções do Java (Java Collections Framework) 2009/2010 Programação Orientada por Objectos 32

Notes de l'éditeur

  1. Consulte a documentação da interface Comparable, onde encontrará as propriedades que a operação compareTo tem de ter. É essencial fazê-lo antes de pensar em fornecer a sua própria implementação dessa operação.
  2. Consulte a documentação da interface Comparable, onde encontrará as propriedades que a operação compareTo tem de ter e de que forma deve ser consistente com equals. É essencial fazê-lo antes de pensar em fornecer a sua própria implementação dessas operações.Boas práticas:Definir ordenação intrínseca e noção de igualdade apenas para classes representando tipos de valor.Sempre que possível, torne os tipos de valor imutáveis.Consulte a documentação e as boas práticas do Java para garantir que as suas implementações das operações equals e compareTo são completas, correctas e consistentes. É mais difícil do que parece!