Java Coleções Rodrigo C. de Azevedo OMG Certified UML Professional Fundamental OMG Certified UML Professional Intermediate CompTIA Project+ Sun Certified Associate for Java Platform Sun Certified Programmer Java 1.4 Sun Certified Programmer Java 5.0 Sun Certified Web Component Developer Sun Certified Business Component Developer J2EE 1.3 Sun Certified Enterprise Architect [SCEA, Part I] Rodrigo Cabral de Azevedo 2 / 67 1
Roteiro Assuntos Método equals() Método hashcode() Família Collection, suas interfaces e classes concretas Interface Comparable e Comparator Classe Collections Família Map, suas interfaces e classes concretas Referências Rodrigo Cabral de Azevedo 3 / 67 Método equals() - Object Ambiente Sendo A e B dois objetos. A implementação de equals() da classe Object tem o mesmo resultado que a comparação direta dos valores de referências na memória, isto é (A == B). Problema Normalmente este não é comportamento desejado. Ao compararmos dois objetos clientes, por exemplo, diremos que um é igual ao outro se seus CPFs forem iguais independente dos valores de referências em memória. Solução Sobrescrever o método equals(). Rodrigo Cabral de Azevedo 4 / 67 2
Método equals() - Problema public class Cliente { private String cpf; private String nome; private int id; public String getid() { return id; public String getcpf() { return cpf; public void setcpf(string cpf) { this.cpf = cpf; public String getnome() { return nome; public void setnome(string nome) { this.nome = nome; public Cliente(String cpf, String nome) { setcpf(cpf); setnome(nome); // Esta classe está herdando o método equals(). public class TestEquals { public static void main(string[] args) { Cliente c1 = new Cliente( 111.111.111-11, Rodrigo ); Cliente c2 = new Cliente( 111.111.111-11, Rodrigo ); System.out.println(c1.equals(c2)); // Será retornado falso. System.out.println( c1 == c2 ); // Será retornado falso. Rodrigo Cabral de Azevedo 5 / 67 Método equals() - Contrato Reflexivo Para qualquer valor de x, x.equals(x) sempre tem que ser verdadeiro. Simétrico Para qualquer valor de x e y, se x.equals(y) for verdadeiro, então y.equals(x) também tem ser verdadeiro. Transitivo Para qualquer valor de x, y e z. Se x.equals(y) for verdadeiro e y.equals(z) for verdadeiro então x.equals(z) será verdadeiro. Consistente Para qualquer valor de x e y, o fato de múltiplas invocações deve retornar sempre o mesmo, ao menos que um dos objetos sejam alterados. Valor Nulo Qualquer valor comparado a um valor nulo deve retornar falso. Rodrigo Cabral de Azevedo 6 / 67 3
Método equals() - Sobrescrito public class Cliente { private String cpf; private String nome; private int id; public String getid() { return id; public String getcpf() { return cpf; public void setcpf(string cpf) { this.cpf = cpf; public String getnome() { return nome; public void setnome(string nome) { this.nome = nome; public Cliente(String cpf, String nome) { setcpf(cpf); setnome(nome); public boolean equals(object o) { if (o==null) { return false; if (!(o instanceof Cliente)) { return false; Cliente c = (Cliente)o; return c.getcpf().equals(this.getcpf()); Rodrigo Cabral de Azevedo 7 / 67 Método equals() - Solução public class TestEquals { public static void main(string[] args) { Cliente c1 = new Cliente( 111.111.111-11, Rodrigo ); Cliente c2 = new Cliente( 111.111.111-11, Rodrigo ); System.out.println( c1.equals( c2 ) ); // Será retornado true, conforme desejado. // Será retornado false, pois são referências diferentes que representam o mesmo objeto. System.out.println( c1 == c2 ); Rodrigo Cabral de Azevedo 8 / 67 4
Método hashcode() Definição O valor hashcode de um objeto é usado por algumas coleções como HashMap, HashSet, Hashtable entre outras e determina onde o objeto deve ser armazenado. Também ajuda na localização do mesmo na coleção. Rodrigo Cabral de Azevedo 9 / 67 Método hashcode() Consistente Múltiplas invocações de um mesmo objeto não modificado deve retornar sempre o mesmo hashcode. Outras Premissas Se 2 objetos ao serem comparados pelo método equals() são iguais, então o hashcode retornado será o mesmo. Não é obrigatório que 2 objetos diferentes quando comparados pelo método equals(), tenham hashcodes diferentes. Rodrigo Cabral de Azevedo 10 / 67 5
Método hashcode() Objetos com hashcode iguais Estão na mesma gaveta, portanto é retornado o mesmo valor inteiro (hashcode). Não significa que é o mesmo objeto (apesar de ser uma possibilidade), apenas que está na mesma gaveta. Objetos com hashcode diferentes Estão em outra gaveta, portanto é retornado valores inteiros (hashcode) diferentes. Indica que não há nenhuma possibilidade de serem o mesmo objeto. Analogia com um Arquivo Rodrigo Cabral de Azevedo 11 / 67 Método hashcode() - Sobrescrito public class Cliente { // Parte do código foi intencionalmente ocultada. public boolean equals(object o) { if (o==null) { return false; if (!(o instanceof Cliente)) { return false; Cliente c = (Cliente)o; return c.getcpf().equals(this.getcpf()); /* Uma outra forma mais simples de implementar este método, mas com certeza não é a mais otimizada, é utilizar o Id do banco para representar o hashcode. */ public int hashcode() { return id; Rodrigo Cabral de Azevedo 12 / 67 6
Método hashcode() - Sobrescrito public class Pessoa { int id; String nome; public int getid() { return id; public void setid(int id) { this.id = id; public String getnome() { return nome; public void setnome(string nome) { this.nome = nome; // Exemplo do método hashcode gerado pela IDE Eclipse. public int hashcode() { final int PRIME = 31; int result = 1; result = PRIME * result + id; return result; Rodrigo Cabral de Azevedo 13 / 67 Coleções - API Rodrigo Cabral de Azevedo 14 / 67 7
Coleções Família Collection Rodrigo Cabral de Azevedo 15 / 67 Collection, List, Set, Sortedset, Queue A família proveniente da interface Collection É formada pelas interfaces List, Queue, Set e SortedSet. Todas as interfaces possuem classes concretas (implementações) que possibilitam a criação de suas instâncias. Rodrigo Cabral de Azevedo 16 / 67 8
Regra é-um Regra é-um Também conhecida como regra da Substituição ou principio de Liskov diz que: Sejam duas classes X e Y, onde X é uma generalização de Y. Não pode haver diferenças entre utilizar instâncias de Y ou de X, do ponto de vista dos clientes de X. Rodrigo Cabral de Azevedo 17 / 67 Interface Collection É a interface mais genérica. Pode representar qualquer instância das interfaces Queue, List, Sort e SortedSet. * * Apenas os métodos mais usuais da interface Collection foram representados. Rodrigo Cabral de Azevedo 18 / 67 9
Interface Collection Formas de percorrer (até Java 1.4) Através da interface Iterator: public class TestCollection { public static void main (String args[]) { // Interface Collection recebendo instância de uma classe concreta. Collection c = new ArrayList(); c.add( Rodrigo ); c.add( Luciana ); c.add( João ); // Percorrendo a coleção for (Iterator oit = c.iterator(); oit.hasnext();) { String s = (String)oIt.next(); System.out.println(s); Rodrigo Cabral de Azevedo 19 / 67 Interface Collection Formas de percorrer (a partir do Java 1.5) 1ª - Através da interface Iterator: public class TestCollection { public static void main (String args[]) { // Interface Collection recebendo instância de uma classe concreta. Collection<String> c = new ArrayList<String>(); c.add( Rodrigo ); c.add( Luciana ); c.add( João ); // Percorrendo a coleção for (Iterator<String> oit = c.iterator(); oit.hasnext();) { String s = oit.next(); System.out.println(s); Rodrigo Cabral de Azevedo 20 / 67 10
Interface Collection Formas de percorrer (a partir do Java 1.5) 2ª - Através do for-each: public class TestCollection { public static void main (String args[]) { // Interface Collection recebendo instância de uma classe concreta. Collection<String> c = new ArrayList<String>(); c.add( Rodrigo ); c.add( Luciana ); c.add( João ); // Percorrendo a coleção for (String s : c) { System.out.println(s); Rodrigo Cabral de Azevedo 21 / 67 Interface List Permite a inserção de objetos duplicados. Respeita a ordem de inserção. Pela Regra da Substituição, podemos afirmar que pode ser percorrida utilizando todas as formas permitidas da Interface Collection. Rodrigo Cabral de Azevedo 22 / 67 11
Interface List Formas de percorrer 3ª - Através do for convencional: public class TestList { public static void main (String args[]) { // Interface List recebendo instância de uma classe concreta. List<String> l = new ArrayList<String>(); l.add( Rodrigo ); l.add( Luciana ); l.add( João ); // Percorrendo a coleção for (int i = 0; i < l.size(); i ++) { String s = l.get( i ); System.out.println(s); Rodrigo Cabral de Azevedo 23 / 67 Coleções Família List A família proveniente da interface List É formada atualmente por 3 classes concretas. Estas classes são Vector, LinkedList e ArrayList. Rodrigo Cabral de Azevedo 24 / 67 12
Classe Vector Uma das primeiras classes de coleção criadas no Java. É sincronizada (Thead-safety), e, por isso, mais lenta. Rodrigo Cabral de Azevedo 25 / 67 Classe LinkedList Representa uma lista duplamente encadeada. Possui métodos, além dos presentes na interface List, que possibilitam incluir e remover objetos no início e no final da lista. É a mais rápida ao incluir ou remover a um objeto. É mais lenta que o ArrayList para percorrer, no entanto, quando há a necessidade de se incluir/remover muitos objetos é a mais indicada. Rodrigo Cabral de Azevedo 26 / 67 13
Classe ArrayList Mais rápida que a classe Vector pois não é sincronizada. Rápida iteração. Escolha esta classe ao invés da LinkedList quando precisar de rápida iteração mas não irá fazer muitas inserções e remoções na Lista. Rodrigo Cabral de Azevedo 27 / 67 Interface Set Não permite a inserção de objetos duplicados. Pela Regra da Substituição, podemos afirmar que pode ser percorrida utilizando todas as formas permitidas da Interface Collection. Diferentemente da List não há outra forma de percorrer a coleção. O método add() retorna true se o objeto ainda não foi incluído, senão nada ocorre e retorna false. Rodrigo Cabral de Azevedo 28 / 67 14
Coleções Família Set A família proveniente da interface Set É formada atualmente por 3 classes concretas e 1 interface. Estas classes são HashSet, LinkedHashSet e TreeSet. Em relação a classe TreeSet, é importante observar que é uma implementação da interface SortedSet. Rodrigo Cabral de Azevedo 29 / 67 Classe HashSet Não respeita a ordem de inserção. Não há nenhum tipo de ordenação. Utiliza o hashcode produzido pelo método hashcode() do objeto inserido para melhorar a performance de acesso. Esta classe deve ser utilizada quando não se deseja que haja duplicação e a ordem de inserção não importa. Rodrigo Cabral de Azevedo 30 / 67 15
Classe LinkedHashSet Respeita a ordem de inserção. Não há nenhum tipo de ordenação. Esta classe deve ser utilizada quando não se deseja que haja duplicação e a ordem de inserção é importante. Rodrigo Cabral de Azevedo 31 / 67 Classe HashSet e LinkedHashSet Considerações Importantes A classe dos objetos adicionados deve sobrescrever o método hashcode(). A implementação deste método na classe Object pode permitir que um objeto considerado igual a algum inserido na coleção seja adicionado. Desta forma possibilita, incorretamente, a existência de objetos duplicados no Set. Rodrigo Cabral de Azevedo 32 / 67 16
Interface SortedSet Garante que a iteração seja ordenado de acordo com ordem natural (Interface Comparable) ou ordenado de acordo com a interface Comparator. Todos os elementos inseridos na interface SortedSet precisam implementar Comparable ou receber uma interface Comparator no momento da criação. Rodrigo Cabral de Azevedo 33 / 67 Classe TreeSet Permite ordenar os objetos de acordo com a ordem natural fornecida pela interface Comparable. Permite ordenar os objetos de acordo com a ordem fornecida pela interface Comparator. Rodrigo Cabral de Azevedo 34 / 67 17
Interface Comparable A ordem natural é possível através da utilização do método compareto(...) que compara o objeto corrente com outro ordenando-os de acordo com o comportamento definido neste método. Funcionamento do método compareto(o: T) : int Se o retorno for negativo, isto é, o objeto corrente for menor que o comparado então o objeto corrente virá antes na ordenação da coleção. Se o retorno for positivo, isto é, o objeto corrente for maior que o comparado, então o objeto corrente virá depois na ordenação da coleção. Se o retorno for zero, o objeto poderá vir em qualquer ordem. Nota É extremamente recomendado, mas não obrigatório que a expressão (x.compareto(y)==0) == (x.equals(y)) seja verdadeira. Classes que implementarem a interface Comparable e violam esta condição devem indicar isto claramente. Rodrigo Cabral de Azevedo 35 / 67 Interface Comparable Inúmeras classes, como os Wrappers, Calendar, Date e String, implementam a interface Comparable. Em outras palavras, fornecem informações de como realizar a ordenação natural. Rodrigo Cabral de Azevedo 36 / 67 18
Interface Comparable Considerações Importantes Java 1.4 x Java 5.0 Apesar de inúmeras classes na versão 5.0 implementarem a interface Comparable, é recomendado sempre consultar a documentação da linguagem da versão utilizada. Exemplo Até a versão 1.4, a classe Calendar do pacote java.util não implementa a interface Comparable, ou seja, não informa a coleção como deve ser feito a ordenação natural. A partir da versão 5.0 esta interface é implementada. Uma coleção utilizando TreeSet contendo objetos Calendar em versões anteriores a 5.0 deve fornecer uma instância de Comparator* no construtor senão será lançada a exceção ClassCastException. * será vista em seguida Rodrigo Cabral de Azevedo 37 / 67 Interface SorteSet e Comparable public class Pessoa implements Comparable<Pessoa>{ private int id; private String nome; // Imagine que os getters e setters foram gerados. public Pessoa(int id, String nome) { this.setid(id); this.setnome(nome); public int compareto(pessoa p) { return ( this.getid() p.getid() ); public boolean equals(object o) { if (o == null) return false; if (! (o instanceof Pessoa)) return false; Pessoa p = (Pessoa)o; return ( this.getid() == p.getid() ); Rodrigo Cabral de Azevedo 38 / 67 19
Interface SorteSet e Comparable import java.util.*; public class Teste { public static void main(string[] args) { SortedSet<Pessoa> listas = new TreeSet<Pessoa>(); Pessoa p1 = new Pessoa(3, "Rodrigo"); Pessoa p2 = new Pessoa(2, "Luciana"); Pessoa p3 = new Pessoa(1, "Joao"); listas.add(p1); listas.add(p2); listas.add(p3); for (Pessoa p : listas) { System.out.println("Nome: " + p.getnome() + " Id: " + p.getid()); Rodrigo Cabral de Azevedo 39 / 67 Interface Comparator É possível fornecer outra ordenação diferente da ordem natural através da utilização do método compare(...) que compara dois objeto ordenando-os de acordo com o comportamento definido neste método. Funcionamento do método compare(o1: T, o2: T) : int Se o retorno for negativo, isto é, o objeto do primeiro argumento for menor que o comparado no segundo argumento então o objeto corrente virá antes na ordenação da coleção. Se o retorno for positivo, isto é, o objeto do primeiro argumento for maior que o comparado no segundo argumento então o objeto corrente virá depois na ordenação da coleção. Se o retorno for zero, o objeto poderá vir em qualquer ordem. Nota É recomendado utilizar a implementação do equals da classe Object, entretanto, segundo a documentação da Sun, a capacidade de identificar se um objeto Comparator é igual a outro pode, em alguns casos, aumentar a performance. Rodrigo Cabral de Azevedo 40 / 67 20
Interface SorteSet e Comparator public class PessoaComparator implements Comparator<Pessoa>{ public int compare(pessoa p1, Pessoa p2) { return ( p1.getnome().compareto(p2.getnome() ) ); // Pode-se deixar a implementação do Object para o método equals. Rodrigo Cabral de Azevedo 41 / 67 Interface SorteSet e Comparator import java.util.*; public class Teste { public static void main(string[] args) { SortedSet<Pessoa> listas = new TreeSet<Pessoa>(new PessoaComparator()); Pessoa p1 = new Pessoa(3, "Rodrigo"); Pessoa p2 = new Pessoa(2, "Luciana"); Pessoa p3 = new Pessoa(1, "Joao"); listas.add(p1); listas.add(p2); listas.add(p3); for (Pessoa p : listas) { System.out.println("Nome: " + p.getnome() + " Id: " + p.getid()); Rodrigo Cabral de Azevedo 42 / 67 21
Interface Queue Queues normalmente, mas não necessariamente, terão seus elementos obedecendo o formato FIFO (first-in-firstout). As exceções são as priority queues, onde os elementos serão ordenados de acordo com o objeto Comparator passado, ou de acordo com a ordem natural informado pela interface Comparable e as pilhas que ordenam os elementos como LIFO (last-infirst-out). Pela Regra da Substituição, podemos afirmar que pode ser percorrida utilizando todas as formas permitidas da Interface Collection. Rodrigo Cabral de Azevedo 43 / 67 Interface Queue - Métodos element() Obtém o elemento, mas não o remove. Lança a exceção NoSuchElementException se a queue estiver vazia. offer(e o) Insere um elemento na fila. peek() Obtém o elemento, mas não o remove. Retorna null se a queue estiver vazia. poll() Obtém o elemento e o remove da queue, ou retorna null se estiver vazia. remove() Obtém o elemento e o remove da queue. Lança a exceção NoSuchElementException se a queue estiver vazia. Rodrigo Cabral de Azevedo 44 / 67 22
Coleções Família Queue A família proveniente da interface Queue É formada atualmente por 2 classes concretas. Estas classes são PriorityQueue e LinkedList. Rodrigo Cabral de Azevedo 45 / 67 Classe LinkedList Esta classe, que também implementa List, implementa Queue, e, ao fazer isso possibilita o comportamento FIFO (first-in-first-out). Além disso, é possível facilmente simular uma pilha com os métodos existentes. Rodrigo Cabral de Azevedo 46 / 67 23
Classe PriorityQueue Estas filas ordenam os elementos com o especificado no momento da criação de acordo com o construtor utilizado. É possível utilizar a ordem natural (definida por Comparable) ou a ordem definida pela interface Comparator. Esta classe não permite elementos nulos. Assim como na classe TreeSet, se for informado algum objeto que não é comparável (não implementa Comparable e não for passado um objeto Comparator) será lançada a exceção ClassCastException. Rodrigo Cabral de Azevedo 47 / 67 Interface Queue com PriorityQueue Formas de percorrer public class TestQueue2 { public static void main(string[] args) { Queue<Pessoa> q = new PriorityQueue<Pessoa>(); Pessoa pl = new Pessoa("Rodrigo",2); Pessoa p2 = new Pessoa("Luciana",3); Pessoa p3 = new Pessoa("Jose",1); q.offer(pl); q.offer(p2); q.offer(p3); Pessoa pessoa = null; // Pool retira o elemento da Queue. Ao final a fila estará completamente vazia. while ((pessoa = q.poll())!=null) { System.out.println("Nome: " + pessoa.getnome() + " Id: " + pessoa.getid()); System.out.println("Vazia: " + q.isempty()); Rodrigo Cabral de Azevedo 48 / 67 24
Classe Collections Método sort(...) Há 2 variações, uma que ordena uma coleção do tipo List através da ordem natural (implementação de Comparable) e outra que possibilita informar a ordenação desejada através de um objeto Comparator. Nota O método sort() lancará a exceção ClassCastException se a lista utilizada conter objetos não comparáveis da mesma forma que ocorre com a classe TreeSet e a PriorityQueue. Rodrigo Cabral de Azevedo 49 / 67 Classe Collections Método binarysearch(...) A utilização deste método deve respeitar algumas premissas: A lista tem que estar previamente ordenada. Caso tenha sido utilizado na ordenação um objeto Comparator no método sort(), isto é, não foi utilizada a ordem natural, o mesmo tem de ser informado como parâmetro do método. Rodrigo Cabral de Azevedo 50 / 67 25
Classe Collections Método binarysearch(...) O método binarysearch() retornará o índice do objeto procurado. Se o objeto procurado não estiver presente na lista, será retornado um inteiro negativo, cujo o valor absoluto representa a posição (ou índice) onde o objeto deveria estar caso existisse na lista somado de 1. Rodrigo Cabral de Azevedo 51 / 67 Classe Collections Exemplo de uso Numa lista hipotética ordenada alfabeticamente, há em seu conteúdo os seguintes nomes: Arnaldo, Bartolomeu, Xavier. Ao tentar buscar o objeto que representa o nome Carla, será retornado um inteiro que representa o índice da posição onde estaria caso o objeto procurado estivesse na lista (2) somado de 1 (2 + 1 = 3) e multiplicado por -1 apresentando como resultado final um número negativo (-3). Rodrigo Cabral de Azevedo 52 / 67 26
Classe Collections Método binarysearch(...) Imagine que estamos procurando a letra N entre todas as outras do alfabeto. A busca binária irá subdividir a lista enquanto necessário, verificando se o objeto desejado está antes ou depois do centro da divisão, e, fará este processo até encontrar o objeto procurado. A M Objeto procurado N O R Z Rodrigo Cabral de Azevedo 53 / 67 Classe Collections public class TestCollections { public static void main(string[] args) { List<Pessoa> lista = new ArrayList<Pessoa>(); Pessoa pl = new Pessoa("Rodrigo",2); Pessoa p2 = new Pessoa("Luciana",3); Pessoa p3 = new Pessoa("Jose",1); lista.add(pl); lista.add(p2); lista.add(p3); Comparator<Pessoa> comp = new Comparator<Pessoa>() { public int compare(pessoa p1, Pessoa p2) { return p1.getnome().compareto(p2.getnome()); ; Collections.sort(lista, comp); for ( Iterator<Pessoa> oit = lista.iterator(); oit.hasnext(); ) { Pessoa p = oit.next(); System.out.println(p.getNome()); // Buscar por Luciana Pessoa p = new Pessoa(); p.setnome("luciana"); int pos = Collections.binarySearch(lista,p,comp); p = lista.get(pos); System.out.println("Pessoa [Nome: "+p.getnome()+" Id:" + p.getid()+"]"); Rodrigo Cabral de Azevedo 54 / 67 27
Coleção Família Map A família proveniente da interface Map É formada atualmente por 4 classes concretas e 1 interface. Estas classes são HashMap, Hashtable, LinkedHashMap e TreeMap. Em relação a classe TreeMap, é importante observar que é uma implementação da interface SortedSet. Rodrigo Cabral de Azevedo 55 / 67 Interface Map Map permite fornecer uma chave para obter um valor, isto é, associar um objeto a outro. O objeto Map.Entry é obtido através do método entryset() que retorna uma coleção Set deste objeto. A classe Map.Entry possui métodos que possibilitam a obtenção das chaves e dos valores utilizados no Map. Rodrigo Cabral de Azevedo 56 / 67 28
Classe HashMap É a mais rápida no acesso (inserção, obtenção e remoção) de elementos. Permite uma chave nula e múltiplos valores nulos. Não respeita a ordem de inserção e utiliza o resultado do método hashcode() para definir uma ordem otimizada. Rodrigo Cabral de Azevedo 57 / 67 Interface Map com HashMap Formas de percorrer public class TestHashMap { public static void main(string[] args) { Map<String, Pessoa> omap = new HashMap<String, Pessoa>(); Pessoa p1 = new Pessoa("Rodrigo",2); Pessoa p2 = new Pessoa("Luciana",3); Pessoa p3 = new Pessoa("Jose",1); omap.put("professor",p1); omap.put("aluno",p2); omap.put("diretor",p3); Set<String> chaves = omap.keyset(); for (String s : chaves) { Pessoa valor = omap.get(s); System.out.println("Chave: " + s + " Valor: " + valor.getnome()); Rodrigo Cabral de Azevedo 58 / 67 29
Interface Map com HashMap/Entry Formas de percorrer public class TesteEntry { public static void main(string[] args) { Map<String, Pessoa> omap = new HashMap<String, Pessoa>(); Pessoa p1 = new Pessoa("Rodrigo",2); Pessoa p2 = new Pessoa("Luciana",3); Pessoa p3 = new Pessoa("Jose",1); omap.put("professor",p1); omap.put("aluno",p2); omap.put("diretor",p3); Set<Entry<String,Pessoa>> nos = omap.entryset(); for (Entry<String,Pessoa> no : nos) { Pessoa p = no.getvalue(); System.out.println("Chave: " + no.getkey() + " Valor: " + p.getnome()); Rodrigo Cabral de Azevedo 59 / 67 Classe Hashtable Assim como o Vector, é umas das mais antigas estruturas de coleção, e, é sincronizada (Thead-safety). Não permite nenhuma chave nula. Não respeita a ordem de inserção e utiliza o resultado do método hashcode() para definir uma ordem otimizada. Rodrigo Cabral de Azevedo 60 / 67 30
Classe LinkedHashMap Respeita a ordem de inserção. É mais lento que o HashMap para adição e remoção de elementos. É o mais rápido para percorrer. Rodrigo Cabral de Azevedo 61 / 67 Interface Map com LinkedHashMap Formas de percorrer public class TestLinkedHashMap { public static void main(string[] args) { Map<String, Pessoa> omap = new LinkedHashMap<String, Pessoa>(); Pessoa p1 = new Pessoa("Rodrigo",2); Pessoa p2 = new Pessoa("Luciana",3); Pessoa p3 = new Pessoa("Jose",1); omap.put("professor",p1); omap.put("aluno",p2); omap.put("diretor",p3); Set<String> chaves = omap.keyset(); for (String s : chaves) { Pessoa valor = omap.get(s); System.out.println("Chave: " + s + " Valor: " + valor.getnome()); Rodrigo Cabral de Azevedo 62 / 67 31
Interface SortedMap Garante que as chaves sejam ordenadas de acordo com ordem natural (Interface Comparable) ou ordenadas de acordo com a interface Comparator. As chaves inseridas na precisam implementar Comparable ou fornecer uma interface Comparator no momento da criação do SortedMap. Rodrigo Cabral de Azevedo 63 / 67 Classe TreeMap Permite ordenar as chaves de acordo com a ordem natural fornecida pela interface Comparable. Permite ordenar as chaves de acordo com a ordem fornecida pela interface Comparator. Rodrigo Cabral de Azevedo 64 / 67 32
Interface Map com TreeMap Formas de percorrer public class TestTreeMap { public static void main(string[] args) { Map<String, Pessoa> omap = new TreeMap<String, Pessoa>(); Pessoa p1 = new Pessoa("Rodrigo",2); Pessoa p2 = new Pessoa("Luciana",3); Pessoa p3 = new Pessoa("Jose",1); omap.put("professor",p1); omap.put("aluno",p2); omap.put("diretor",p3); Set<String> chaves = omap.keyset(); for (String s : chaves) { Pessoa valor = omap.get(s); System.out.println("Chave: " + s + " Valor: " + valor.getnome()); Rodrigo Cabral de Azevedo 65 / 67 Interface Map com TreeMap Formas de percorrer public class TestTreeMap2 { public static void main(string[] args) { Map<String, Pessoa> omap = new TreeMap<String, Pessoa>(); Pessoa p1 = new Pessoa("Rodrigo",2); Pessoa p2 = new Pessoa("Luciana",3); Pessoa p3 = new Pessoa("Jose",1); omap.put("professor",p1); omap.put("aluno",p2); omap.put("diretor",p3); Collection<Pessoa> valores = omap.values(); for (Pessoa p : valores) { System.out.println("Valor: " + p.getnome()); Como utilizamos um TreeMap, a ordenação ocorreu normalmente nas chaves. Ao solicitarmos os valores através do método values(), os objetos virão ordenados de acordo com a chave. Rodrigo Cabral de Azevedo 66 / 67 33
Referências SIERRA, Kathy; BATES, Bert. Sun Certified Programmer for Java 5 Study Guide. McGraw-Hill/Osborne, 2006 Site java.sun.com Rodrigo Cabral de Azevedo 67 / 67 34