Java Como Programar, 8/E Slide 1 Deitel/Deitel, 8e. • Java – Como programar • Copyright © 2010 Pearson Education Slide 2 Deitel/Deitel, 8e. • Java – Como programar • Copyright © 2010 Pearson Education Slide 3 Deitel/Deitel, 8e. • Java – Como programar • Copyright © 2010 Pearson Education Slide 4 Deitel/Deitel, 8e. • Java – Como programar • Copyright © 2010 Pearson Education Slide 5 Estrutura de coleções do Java. Estruturas de dados predefinidas. Interfaces e métodos para manipular essas estruturas de dados Deitel/Deitel, 8e. • Java – Como programar • Copyright © 2010 Pearson Education Slide 6 Uma coleção é uma estrutura de dados — na realidade, um objeto — que pode armazenar referências a outros objetos. Normalmente, as coleções contêm referências a objetos que são todos do mesmo tipo. A Figura 20.1 lista algumas interfaces da estrutura de coleções. Pacote java.util. Deitel/Deitel, 8e. • Java – Como programar • Copyright © 2010 Pearson Education Slide 7 Deitel/Deitel, 8e. • Java – Como programar • Copyright © 2010 Pearson Education Slide 8 Cada tipo primitivo tem uma classe empacotadora de tipo correspondente (no pacote java.lang). Boolean, Byte, Character, Double, Float, Integer, Long e Short. Cada classe empacotadora de tipo permite manipular valores de tipo primitivo como objetos. As coleções não podem manipular variáveis de tipos primitivos. Elas podem manipular objetos das classes empacotadoras de tipos, porque toda classe, em última instância, deriva de Object. Deitel/Deitel, 8e. • Java – Como programar • Copyright © 2010 Pearson Education Slide 9 Cada uma das classes empacotadoras de tipos numéricos — Byte, Short, Integer, Long, Float e Double — estendem a classe Number. As classes empacotadoras de tipos são classes final, portanto, você não pode estendê-las. Os tipos primitivos não têm métodos, então, os métodos relacionados a um tipo primitivo estão localizados na classe empacotadora de tipo correspondente. Deitel/Deitel, 8e. • Java – Como programar • Copyright © 2010 Pearson Education Uma conversão boxing converte um valor de um tipo primitivo em um objeto da classe empacotadora de tipo correspondente. Uma conversão unboxing converte um objeto de uma classe empacotadora de tipo em um valor do tipo primitivo correspondente. Essas conversões podem ser realizadas automaticamente (chamam-se autoboxing e auto-unboxing). Exemplo: ◦ // cria integerArray Integer[] integerArray = new Integer[ 5 ]; // assign Integer 10 to integerArray[ 0 ] integerArray[ 0 ] = 10; // get int value of Integer int value = integerArray[ 0 ]; Slide 10 Deitel/Deitel, 8e. • Java – Como programar • Copyright © 2010 Pearson Education Slide 11 A interface Collection é a interface-raiz a partir da qual as interfaces Set, Queue e List são derivadas. A interface Set define uma coleção que não contém duplicatas. A interface Queue define uma coleção que representa uma fila de espera. A interface Collection contém operações de volume para adicionar, limpar e comparar objetos de uma coleção. Uma Collection também pode ser convertida em um array. A interface Collection fornece um método que retorna um objeto Iterator, que permite a um programa percorrer a coleção e remover elementos da coleção durante a iteração. A classe Collections fornece os métodos static que pesquisam, classificam e realizam outras operações em coleções. Deitel/Deitel, 8e. • Java – Como programar • Copyright © 2010 Pearson Education Slide 12 Deitel/Deitel, 8e. • Java – Como programar • Copyright © 2010 Pearson Education Slide 13 Deitel/Deitel, 8e. • Java – Como programar • Copyright © 2010 Pearson Education Slide 14 Uma List (às vezes, chamada sequência) é uma Collection que pode conter elementos duplicados. Os índices de List são baseados em zero. Além dos métodos herdados de Collection, List fornece métodos para manipular elementos via seus índices, manipular um intervalo especificado de elementos, procurar elementos e obter um ListIterator para acessar os elementos. A interface List é implementada por várias classes, incluindo ArrayList, LinkedList e Vector. O autoboxing ocorre quando você adiciona valores de tipo primitivo a objetos dessas classes, pois eles armazenam apenas referências a objetos. Deitel/Deitel, 8e. • Java – Como programar • Copyright © 2010 Pearson Education Slide 15 As classes ArrayList e Vector são implementações de arrays redimensionáveis de List. Inserir um elemento entre elementos existentes de um ArrayList ou Vector é uma operação ineficiente. Uma LinkedList permite inserção (ou remoção) eficiente de elementos no meio de uma coleção. Discutimos a arquitetura de listas encadeadas (vinculadas) no Capítulo 22. A principal diferença entre ArrayList e Vector é que Vectors são sincronizados por padrão, enquanto ArrayLists não o são. As coleções não sincronizadas fornecem melhor desempenho que as sincronizadas. Por essa razão, ArrayList é, em geral, preferida a Vector em programas que não compartilham uma coleção entre threads. Deitel/Deitel, 8e. • Java – Como programar • Copyright © 2010 Pearson Education Slide 16 Deitel/Deitel, 8e. • Java – Como programar • Copyright © 2010 Pearson Education Slide 17 Deitel/Deitel, 8e. • Java – Como programar • Copyright © 2010 Pearson Education Slide 18 O método List add adiciona um item ao final de uma lista. O método List size retorna o número de elementos. O método List get recupera o valor de um elemento individual de um índice especificado. O método Collection iterator obtém um Iterator de uma Collection. O método Iterator hasNext determina se uma Collection contém mais elementos. Retorna true se houver outro elemento e, false, caso contrário. O método Iterator next retorna uma referência para o próximo elemento. O método Collection contains determina se uma Collection contém um elemento especificado. O método Iterator remove o elemento atual de uma Collection. Deitel/Deitel, 8e. • Java – Como programar • Copyright © 2010 Pearson Education Slide 19 Deitel/Deitel, 8e. • Java – Como programar • Copyright © 2010 Pearson Education Slide 20 Deitel/Deitel, 8e. • Java – Como programar • Copyright © 2010 Pearson Education Slide 21 Deitel/Deitel, 8e. • Java – Como programar • Copyright © 2010 Pearson Education Slide 22 Deitel/Deitel, 8e. • Java – Como programar • Copyright © 2010 Pearson Education Slide 23 O método List addAll acrescenta todos os elementos de uma coleção ao final de uma List. O método List listIterator obtém o iterador bidirecional de uma List. O método String toUpperCase obtém uma versão em letras maiúsculas de uma String. O método ListIterator set substitui o elemento atual ao qual o iterador referencia por um objeto especificado. O método String toLowerCase retorna uma versão em letras minúsculas de uma String. O método List subList obtém uma parte de uma List. Isso é o que chamamos de método de visualização de intervalo, que permite ao programa visualizar uma parte da lista. Deitel/Deitel, 8e. • Java – Como programar • Copyright © 2010 Pearson Education Slide 24 O método List clear remove os elementos de uma List. O método List size retorna o número de itens na List. O método ListIterator hasPrevious determina se há mais elementos ao percorrer a lista de trás para frente. O método ListIterator previous obtém o elemento anterior na lista. Deitel/Deitel, 8e. • Java – Como programar • Copyright © 2010 Pearson Education Slide 25 Deitel/Deitel, 8e. • Java – Como programar • Copyright © 2010 Pearson Education Slide 26 Deitel/Deitel, 8e. • Java – Como programar • Copyright © 2010 Pearson Education Slide 27 Deitel/Deitel, 8e. • Java – Como programar • Copyright © 2010 Pearson Education Slide 28 Deitel/Deitel, 8e. • Java – Como programar • Copyright © 2010 Pearson Education Slide 29 A classe Arrays fornece o método static asList para visualizar um array como uma coleção List. Uma visualização List permite manipular o array como se ele fosse uma lista. Isso é útil para adicionar os elementos de um array a uma coleção e para classificar os elementos do array. Qualquer modificação feita por meio da visualização List altera o array, e qualquer modificação feita no array altera a visualização List. A única operação permitida na visualização retornada por asList é set, que altera o valor da visualização e o array de apoio. Quaisquer outras tentativas de alterar a visualização resultam em uma UnsupportedOperationException. O método List toArray obtém um array de uma coleção List. Deitel/Deitel, 8e. • Java – Como programar • Copyright © 2010 Pearson Education Slide 30 Deitel/Deitel, 8e. • Java – Como programar • Copyright © 2010 Pearson Education Slide 31 Deitel/Deitel, 8e. • Java – Como programar • Copyright © 2010 Pearson Education Slide 32 O método LinkedList addLast adiciona um elemento ao final de uma List. O método LinkedList add também adiciona um elemento ao final de uma List. O método LinkedList addFirst adiciona um elemento ao início de uma List. Deitel/Deitel, 8e. • Java – Como programar • Copyright © 2010 Pearson Education Slide 33 Deitel/Deitel, 8e. • Java – Como programar • Copyright © 2010 Pearson Education Slide 34 A classe Collections fornece vários algoritmos de alto desempenho para manipular elementos de coleção. Os algoritmos (Figura 20.5) são implementados como métodos static. Deitel/Deitel, 8e. • Java – Como programar • Copyright © 2010 Pearson Education Slide 35 Deitel/Deitel, 8e. • Java – Como programar • Copyright © 2010 Pearson Education Slide 36 Deitel/Deitel, 8e. • Java – Como programar • Copyright © 2010 Pearson Education Slide 37 O método sort classifica os elementos de uma List. Os elementos devem implementar a interface Comparable. A ordem é determinada pela ordem natural do tipo dos elementos como implementado por um método compareTo. O método compareTo é declarado na interface Comparable e, às vezes, é chamado de método natural de comparação. A chamada sort pode especificar como um segundo argumento um objeto Comparator que determina uma ordem alternativa dos elementos. Deitel/Deitel, 8e. • Java – Como programar • Copyright © 2010 Pearson Education Slide 38 Deitel/Deitel, 8e. • Java – Como programar • Copyright © 2010 Pearson Education Slide 39 Deitel/Deitel, 8e. • Java – Como programar • Copyright © 2010 Pearson Education Slide 40 A interface Comparator é utilizada para classificar elementos de uma Collection em uma ordem diferente. O método static Collections reverseOrder retorna um objeto Comparator que ordena os elementos da coleção na ordem inversa. Deitel/Deitel, 8e. • Java – Como programar • Copyright © 2010 Pearson Education Slide 41 Deitel/Deitel, 8e. • Java – Como programar • Copyright © 2010 Pearson Education Slide 42 Deitel/Deitel, 8e. • Java – Como programar • Copyright © 2010 Pearson Education Slide 43 A Figura 20.8 cria uma classe Comparator personalizada, chamada TimeComparator, que implementa a interface Comparator para comparar dois objetos Time2. A classe Time2, declarada na Figura 8.5, representa o tempo em horas, minutos e segundos. A classe TimeComparator implementa a interface Comparator, um tipo genérico que aceita argumento de um único tipo. Uma classe que implementa Comparator deve declarar um método compare que recebe dois argumentos e retorna um número inteiro negativo se o primeiro argumento for menor que o segundo, 0 se os argumentos forem iguais ou um número inteiro positivo se o primeiro argumento for maior do que o segundo. Deitel/Deitel, 8e. • Java – Como programar • Copyright © 2010 Pearson Education Slide 44 Deitel/Deitel, 8e. • Java – Como programar • Copyright © 2010 Pearson Education Slide 45 Deitel/Deitel, 8e. • Java – Como programar • Copyright © 2010 Pearson Education Slide 46 Deitel/Deitel, 8e. • Java – Como programar • Copyright © 2010 Pearson Education Slide 47 Deitel/Deitel, 8e. • Java – Como programar • Copyright © 2010 Pearson Education Slide 48 O método shuffle ordena aleatoriamente os elementos de uma List. Deitel/Deitel, 8e. • Java – Como programar • Copyright © 2010 Pearson Education Slide 49 Deitel/Deitel, 8e. • Java – Como programar • Copyright © 2010 Pearson Education Slide 50 Deitel/Deitel, 8e. • Java – Como programar • Copyright © 2010 Pearson Education Slide 51 Deitel/Deitel, 8e. • Java – Como programar • Copyright © 2010 Pearson Education Slide 52 Deitel/Deitel, 8e. • Java – Como programar • Copyright © 2010 Pearson Education Slide 53 Deitel/Deitel, 8e. • Java – Como programar • Copyright © 2010 Pearson Education Slide 54 O método Collections reverse inverte a ordem dos elementos em uma List. O método fill sobrescreve elementos em uma List com um valor específico. O método copy recebe dois argumentos — uma List de destino e uma List de origem. Cada elemento da List de origem é copiado para a List de destino. A List de destino deve ser pelo menos tão longa quanto a List de origem; caso contrário, uma IndexOutOfBoundsException ocorre. Se a List de destino for mais longa, os elementos não sobrescritos permanecerão inalterados. Os métodos min e max operam sobre qualquer Collection. O método min retorna o menor elemento de uma Collection e o método max retorna o maior elemento de uma Collection. Deitel/Deitel, 8e. • Java – Como programar • Copyright © 2010 Pearson Education Slide 55 Deitel/Deitel, 8e. • Java – Como programar • Copyright © 2010 Pearson Education Slide 56 Deitel/Deitel, 8e. • Java – Como programar • Copyright © 2010 Pearson Education Slide 57 Deitel/Deitel, 8e. • Java – Como programar • Copyright © 2010 Pearson Education Slide 58 O método static Collections binarySearch localiza um objeto em uma List. Se o objeto for encontrado, seu índice será retornado. Se o objeto não for localizado, binarySearch retornará um valor negativo. O método binarySearch determina esse valor negativo primeiro calculando o ponto de inserção e tornando seu sinal negativo. Então, binarySearch subtrai 1 do ponto de inserção para obter o valor de retorno, que garante que o método binarySearch retorna números positivos (>=0) se e somente se o objeto for localizado. Deitel/Deitel, 8e. • Java – Como programar • Copyright © 2010 Pearson Education Slide 59 Deitel/Deitel, 8e. • Java – Como programar • Copyright © 2010 Pearson Education Slide 60 Deitel/Deitel, 8e. • Java – Como programar • Copyright © 2010 Pearson Education Slide 61 Deitel/Deitel, 8e. • Java – Como programar • Copyright © 2010 Pearson Education Slide 62 O método Collections addAll aceita dois argumentos — uma Collection na qual inserir o(s) novo(s) elemento(s) e um array que fornece elementos a ser inseridos. O método Collections frequency aceita dois argumentos — uma Collection a ser pesquisada e um Object a ser procurado na coleção. O método frequency retorna o número de vezes que o segundo argumento aparece na coleção. O método Collections disjoint aceita duas Collections e retorna true se elas não tiverem nenhum elemento em comum. Deitel/Deitel, 8e. • Java – Como programar • Copyright © 2010 Pearson Education Slide 63 Deitel/Deitel, 8e. • Java – Como programar • Copyright © 2010 Pearson Education Slide 64 Deitel/Deitel, 8e. • Java – Como programar • Copyright © 2010 Pearson Education Slide 65 Deitel/Deitel, 8e. • Java – Como programar • Copyright © 2010 Pearson Education Slide 66 A classe Stack do pacote de utilitários Java (java.util) estende a classe Vector para implementar uma estrutura de dados de pilha. O método Stack push adiciona um objeto Number à parte superior da pilha. Qualquer literal inteiro que tenha o sufixo L é um valor long. Um literal de inteiro sem sufixo é um valor int. Qualquer literal de ponto flutuante que tenha o sufixo F é um valor float. Um literal de ponto flutuante sem sufixo é um valor double. O método Stack pop remove o elemento superior da pilha. Se não houver nenhum elemento na Stack, o método pop lança uma EmptyStackException, que termina o loop. O método peek retorna o elemento no topo da pilha sem remover o elemento da pilha. O método isEmpty determina se a pilha está vazia. Deitel/Deitel, 8e. • Java – Como programar • Copyright © 2010 Pearson Education Slide 67 Deitel/Deitel, 8e. • Java – Como programar • Copyright © 2010 Pearson Education Slide 68 Deitel/Deitel, 8e. • Java – Como programar • Copyright © 2010 Pearson Education Slide 69 Deitel/Deitel, 8e. • Java – Como programar • Copyright © 2010 Pearson Education Slide 70 Deitel/Deitel, 8e. • Java – Como programar • Copyright © 2010 Pearson Education Slide 71 Deitel/Deitel, 8e. • Java – Como programar • Copyright © 2010 Pearson Education Slide 72 A interface Queue estende a interface Collection e fornece operações adicionais para inserir, remover e inspecionar elementos em uma fila. PriorityQueue ordena os elementos de acordo com seu ordenamento natural. Os elementos são inseridos na ordem de prioridade de tal modo que o elemento de maior prioridade (isto é, o maior valor) será o primeiro elemento removido da PriorityQueue. As operações PriorityQueue comuns são: ◦ offer para inserir um elemento na localização adequada com base na ordem de prioridade. ◦ poll para remover o elemento de mais alta prioridade da fila de prioridade. ◦ peek para obter uma referência ao elemento de prioridade mais alta da fila de prioridades. ◦ clear para remover todos os elementos da fila de prioridades. ◦ size para obter o número de elementos na fila. Deitel/Deitel, 8e. • Java – Como programar • Copyright © 2010 Pearson Education Slide 73 Deitel/Deitel, 8e. • Java – Como programar • Copyright © 2010 Pearson Education Slide 74 Deitel/Deitel, 8e. • Java – Como programar • Copyright © 2010 Pearson Education Slide 75 Um Set é uma Collection não ordenada de elementos únicos (isto é, sem elementos duplicados). A estrutura de coleções contém diversas implementações de Set, incluindo HashSet e TreeSet. HashSet armazena seus elementos em uma tabela de hash e TreeSet armazena seus elementos em uma árvore. Deitel/Deitel, 8e. • Java – Como programar • Copyright © 2010 Pearson Education Slide 76 Deitel/Deitel, 8e. • Java – Como programar • Copyright © 2010 Pearson Education Slide 77 Deitel/Deitel, 8e. • Java – Como programar • Copyright © 2010 Pearson Education Slide 78 A estrutura de coleções também inclui a interface SortedSet (que estende Set) para conjuntos que mantêm seus elementos em ordem de classificação. A classe TreeSet implementa SortedSet. O método TreeSet headSet obtém um subconjunto de TreeSet em que todo elemento é menor do que o valor especificado. O método TreeSet tailSet obtém um subconjunto em que cada elemento é maior ou igual a um elemento especificado. Os métodos SortedSet first e last obtêm os menores e os maiores elementos do conjunto, respectivamente. Deitel/Deitel, 8e. • Java – Como programar • Copyright © 2010 Pearson Education Slide 79 Deitel/Deitel, 8e. • Java – Como programar • Copyright © 2010 Pearson Education Slide 80 Deitel/Deitel, 8e. • Java – Como programar • Copyright © 2010 Pearson Education Slide 81 Deitel/Deitel, 8e. • Java – Como programar • Copyright © 2010 Pearson Education Slide 82 Maps associam chaves a valores. As chaves de um Map devem ser únicas, mas os valores associados, não. Se um Map contiver tanto chaves como valores únicos, dizemos que ele implementa um mapeamento um para um. Se apenas as chaves forem únicas, dizemos que o Map implementa um mapeamento de muitos para muitos — muitas chaves podem mapear para um valor. Três das várias classes que implementam a interface Map são Hashtable, HashMap e TreeMap. Hashtables e HashMaps armazenam elementos em tabelas hash, e TreeMaps armazenam elementos em árvores. Deitel/Deitel, 8e. • Java – Como programar • Copyright © 2010 Pearson Education Slide 83 A interface SortedMap estende Map e mantém suas chaves em ordem de classificação — na ordem natural dos elementos ou em uma ordem especificada por um Comparator. A classe TreeMap implementa SortedMap. Hashing é um esquema de alta velocidade para converter chaves em índices de arrays únicos. O fator de carga de uma tabela de hash afeta o desempenho de esquemas de hashing. O fator de carga é a relação do número de células ocupadas na tabela de hash com o número total de células na tabela de hash. Quanto mais a proporção se aproxima de 1,0, maior a chance de colisões. Deitel/Deitel, 8e. • Java – Como programar • Copyright © 2010 Pearson Education Slide 84 Deitel/Deitel, 8e. • Java – Como programar • Copyright © 2010 Pearson Education Slide 85 Deitel/Deitel, 8e. • Java – Como programar • Copyright © 2010 Pearson Education Slide 86 Deitel/Deitel, 8e. • Java – Como programar • Copyright © 2010 Pearson Education Slide 87 Deitel/Deitel, 8e. • Java – Como programar • Copyright © 2010 Pearson Education Slide 88 Deitel/Deitel, 8e. • Java – Como programar • Copyright © 2010 Pearson Education Slide 89 O método Map containsKey determina se a chave está em um mapa. O método Map put cria uma nova entrada no mapa ou substitui um valor de entrada existente. O método put retorna o valor anterior associado com a chave, ou null se a chave não estiver no mapa. O método get obtém o valor associado com a chave especificada no mapa. O método HashMap keySet retorna um conjunto de chaves. O método size retorna o número dos pares de chaves/valor no Map. O método isEmpty retorna um boolean que indica se o Map está vazio. Deitel/Deitel, 8e. • Java – Como programar • Copyright © 2010 Pearson Education Slide 90 Um objeto Properties é um Hashtable persistente que normalmente armazena os pares de chave/valor de strings — supondo que você utiliza métodos setProperty e getProperty para manipular a tabela em vez dos métodos Hashtable put e get herdados. O conteúdo do objeto Properties pode ser gravado em um fluxo de saída (possivelmente um arquivo) e lido de volta por um fluxo de entrada. Um uso comum de objetos Properties em versões anteriores do Java era manter os dados de configuração de aplicativo ou preferências de usuário de aplicativos. [Nota: A Preferences API (pacote java.util.prefs) foi projetada para substituir esse uso da classe Properties.] Deitel/Deitel, 8e. • Java – Como programar • Copyright © 2010 Pearson Education Slide 91 O método Properties store salva o conteúdo do objeto no OutputStream especificado como o primeiro argumento. O segundo argumento, uma String, é uma descrição gravada no arquivo. O método Properties list, que aceita um argumento PrintStream, é útil para exibir a lista de propriedades. O método Properties load restaura o conteúdo de um objeto Properties a partir do InputStream especificado como o primeiro argumento (nesse caso, um FileInputStream). Deitel/Deitel, 8e. • Java – Como programar • Copyright © 2010 Pearson Education Slide 92 Deitel/Deitel, 8e. • Java – Como programar • Copyright © 2010 Pearson Education Slide 93 Deitel/Deitel, 8e. • Java – Como programar • Copyright © 2010 Pearson Education Slide 94 Deitel/Deitel, 8e. • Java – Como programar • Copyright © 2010 Pearson Education Slide 95 Deitel/Deitel, 8e. • Java – Como programar • Copyright © 2010 Pearson Education Slide 96 Deitel/Deitel, 8e. • Java – Como programar • Copyright © 2010 Pearson Education Slide 97 Os empacotadores de sincronização são utilizados para coleções que podem ser acessadas por múltiplas threads. Um objeto empacotador (wrapper) recebe chamadas de método, adiciona sincronização de thread e delega as chamadas para o objeto de coleção empacotado. A API Collections fornece um conjunto de métodos static para empacotar coleções como versões sincronizadas. Os cabeçalhos de método para os empacotadores de sincronização são listados na Figura 20.20. Deitel/Deitel, 8e. • Java – Como programar • Copyright © 2010 Pearson Education Slide 98 Deitel/Deitel, 8e. • Java – Como programar • Copyright © 2010 Pearson Education Slide 99 A classe Collections fornece um conjunto de métodos static que criam empacotadores não modificáveis para coleções. Empacotadores não modificáveis lançam UnsupportedOperationExceptions se forem feitas tentativas de modificar a coleção. Os cabeçalhos para esses métodos são listados na Figura 20.21. Deitel/Deitel, 8e. • Java – Como programar • Copyright © 2010 Pearson Education Slide 100 Deitel/Deitel, 8e. • Java – Como programar • Copyright © 2010 Pearson Education Slide 101 Deitel/Deitel, 8e. • Java – Como programar • Copyright © 2010 Pearson Education Slide 102 A estrutura de coleções fornece várias implementações abstratas de interfaces Collection a partir das quais você pode implementar rapidamente aplicativos personalizados completos. Elas incluem: ◦ uma implementação simples de Collection chamada AbstractCollection ◦ uma implementação de List que permite acesso aleatório a seus elementos chamada AbstractList. ◦ uma implementação de Map chamada AbstractMap. ◦ uma implementação de List que permite acesso sequencial a seus elementos chamada AbstractSequentialList. ◦ uma implementação de Set chamada AbstractSet. ◦ uma implementação de Queue chamada AbstractQueue. Deitel/Deitel, 8e. • Java – Como programar • Copyright © 2010 Pearson Education