Java collections-basic

383 views
279 views

Published on

0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
383
On SlideShare
0
From Embeds
0
Number of Embeds
4
Actions
Shares
0
Downloads
8
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

Java collections-basic

  1. 1. http://publicationslist.org/junio Java Collections Prof. Jose Fernando Rodrigues Junior http://www.icmc.usp.br/~junio junio@icmc.usp.br INSTITUTO DE CIÊNCIAS MATEMÁTICAS E DE COMPUTAÇÃO - USP - SCC0504 - Programação Orientada a Objetos
  2. 2. http://publicationslist.org/junio Introdução  Set (conjunto): composição elementos sem repetição e sem ordem definida. Exemplo:  A = {banana, maçã, abacate}  Multiset (multi-conjunto): composição de elementos possivelmente com repetição e sem ordem definida. Exemplo:  A = {banana, maçã, abacate, banana} Também denominado: list (lista), grupo (bunch), bag (saco, sacola), heap (monte), sample (amostra), suite (jogo de) e collection (coleção)  Sequência: conjunto de elementos cuja ordem importa. Exemplo: {banana, maçã, abacate} ≠ {maçã, banana, abacate}
  3. 3. http://publicationslist.org/junio Introdução  Set (conjunto): composição elementos sem repetição e sem ordem definida. Exemplo:  A = {banana, maçã, abacate}  Multiset (multi-conjunto): composição de elementos possivelmente com repetição e sem ordem definida. Exemplo:  A = {banana, maçã, abacate, banana} Também denominado: list (lista), grupo (bunch), bag (saco sacola), heap (monte), sample (amostra), suite (jogo de) e collection (coleção)  Sequência: conjunto de elementos cuja ordem importa. Exemplo: {banana, maçã, abacate} ≠ {maçã, banana, abacate} Em computação, pela própria definição baseada na máquina de Turing, conjuntos e multiconjuntos possuem alguma ordem – pois estão em memória. Essa ordem pode ser considerada (definindo-se uma sequência) ou não.
  4. 4. http://publicationslist.org/junio Introdução  Conjuntos, multiconjuntos e sequências são alguns dos principais conceitos de toda a matemática, ciência da computação e mesmo cognição humana  Tratam-se de conceitos abstratos (em contraste a conceitos concretos, como um carro por exemplo)  Em muitos contextos, por praticidade, o termo Collection se refere de maneira geral a conjuntos, multiconjuntos e sequências (ordered collections)
  5. 5. http://publicationslist.org/junio Collections básicas
  6. 6. http://publicationslist.org/junio A interface Collection  Collections em Java começam pela interface de mesmo nome – e são genéricas! public interface Collection<E> extends Iterable<E> { // Basic operations int size(); boolean isEmpty(); boolean contains(Object element); boolean add(E element); //optional boolean remove(Object element); //optional Iterator<E> iterator(); // Bulk operations boolean containsAll(Collection<?> c); boolean addAll(Collection<? extends E> c); //optional boolean removeAll(Collection<?> c); //optional boolean retainAll(Collection<?> c); //optional void clear(); //optional // Array operations Object[] toArray(); <T> T[] toArray(T[] a); } As operações da interface Collection são as operações comuns a conjuntos, multi- conjuntos e sequências.
  7. 7. http://publicationslist.org/junio Iteradores  A idéia de coleções que se baseiam em uma interface raíz e que são genéricas traz dois problemas: 1) a maneira como se percorre os elementos da coleção; por exemplo, percorrer um ArrayList (por índice) é diferente de se percorrer um LinkedList (por encadeamento) 2) não se sabe com antescedência qual o tipo armazenado na coleção, portanto, ponteiros e aritmética de ponteiros não é possível  Solução: iteradores  Iteradores abstraem como e o quê está sendo percorrido em uma coleção, permitindo a escrita de código mais geral (que possui por baixo código mais específico)
  8. 8. http://publicationslist.org/junio Iteradores  A idéia de coleções que se baseiam em uma interface raíz e que são genéricas traz dois problemas: 1) a maneira como se percorre os elementos da coleção; por exemplo, percorrer um ArrayList (por índice) é diferente de se percorrer um LinkedList (por encadeamento) 2) não se sabe com antescedência qual o tipo armazenado na coleção, portanto, ponteiros e aritmética de ponteiros não é possível  Solução: iteradores  Iteradores abstraem como e o quê está sendo percorrido em uma coleção, permitindo a escrita de código mais geral (que possui por baixo código mais específico) A solução é ter a interface Iterable<E> como superinterface da interface Collection <E>: interface Collection <E> extends Iterable<E> O quê requer os seguintes métodos: • boolean hasNext(); • E next(); • void remove();
  9. 9. http://publicationslist.org/junio Iteradores A interface Iterator <E>:  boolean hasNext() Returns true if the iteration has more elements.  E next() Returns the next element in the iteration.  void remove() Removes from the underlying collection the last element returned by the iterator (optional operation). Esses três métodos devem ser implementados para se definir o iterador de uma coleção genérica. Mas já estão disponíveis em um monte de coleções do Java.
  10. 10. http://publicationslist.org/junio Arrays e listas dinâmicas  Arrays (arranjos) e linked lists (listas encadeadas) são as estruturas mais usadas para problemas de collections – elas permitem que se tenha conjuntos, multiconjuntos e sequências em memória  Exemplo NetBeans  ListTest  Quando usar ArrayList e quando usar LinkedList?  ArrayList: quando se têm muito acesso aleatório (acessos não sequenciais), o que é eficiente por meio de índice de array abstraído pelo iterador, e pouca edição (add e remove)  LinkedList: quando se tem muita edição (add e remove) e acesso sequencial dos elementos da lista
  11. 11. http://publicationslist.org/junio Arrays e listas dinâmicas  Alguns collections muito conhecidos são as estruturas de dados Pilha e Fila  Qual é a relação entre arrays, linked lists, pilhas e filas?  Arrays e linked lists são apenas conjuntos de dados (ou coleções)  Pilhas e filas são conjuntos (ou coleções) com restrições de acesso  Portanto:  Um array pode ser uma pilha ou uma fila  Um linked list pode ser uma pilha ou uma fila  Tanto arrays como linked lists são listas (ou conjuntos, ou coleções)  Um array não pode ser um linked list, e vice versa  Uma pilha não pode ser uma fila, e vice versa  Todos são coleções
  12. 12. http://publicationslist.org/junio Arrays e listas dinâmicas  Alguns collections muito conhecidos são as estruturas de dados Pilha e Fila  Qual é a relação entre arrays, linked lists, pilhas e filas?  Arrays e linked lists são apenas conjuntos de dados (ou coleções)  Pilhas e filas são conjuntos (ou coleções) com restrições de acesso  Portanto:  Um array pode ser uma pilha ou uma fila  Um linked list pode ser uma pilha ou uma fila  Tanto arrays como linked lists são listas (ou conjuntos, ou coleções)  Um array não pode ser um linked list, e vice versa  Uma pilha não pode ser uma fila, e vice versa  Todos são coleções Estes e outros fatos se refletem na definição e no uso das coleções do Java.
  13. 13. http://publicationslist.org/junio Queue (Fila)  Fila: trata-se de uma coleção na qual a entrada só ocorre de um lado e a saída só ocorre do lado oposto – FIFO, portanto Fila EntradaSaída
  14. 14. http://publicationslist.org/junio Stack (Pilha)  Pilha: uma coleção na qual a entrada e a saída só ocorrem do mesmo lado – LIFO, portanto Pilha Entrada Saída
  15. 15. http://publicationslist.org/junio ArrayDeque  Array que aceita operações de inserção e remoção em ambas as extremidades  Portanto, um ArrayDeque pode ser:  uma fila sobre um array: métodos add e remove  uma pilha sobre um array: métodos push e pop  Exemplo NetBeans  QueueStackArrayTest Deque Entrada Saída Entrada Saída
  16. 16. http://publicationslist.org/junio LiskedList  Da mesma maneira, um linked list aceita naturalmente operações de adição e remoção em ambas as extremidades  Portanto, uma LinkedList pode ser:  uma fila sobre uma lista encadeada: métodos add e remove  uma pilha sobre sobre uma lista encadeada: métodos push e pop  Exemplo NetBeans  QueueStackLinkedListTest
  17. 17. http://publicationslist.org/junio LiskedList  Da mesma maneira, um linked list aceita naturalmente operações de adição e remoção em ambas as extremidades  Portanto, uma LinledList pode ser:  uma fila sobre uma lista encadeada: métodos add e remove  uma pilha sobre sobre uma lista encadeada: métodos push e pop  Exemplo NetBeans As diferentes possibilidades de implementação dependem das características de cada aplicação. A documentação da classe ArrayDeque adverte que: “This class is likely to be faster than Stack when used as a stack, and faster than LinkedList when used as a queue.” (http://download.oracle.com/javase/6/docs/api/) Já a mais específica classe Stack adverte que: “A more complete and consistent set of LIFO stack operations is provided by the Deque interface and its implementations, which should be used in preference to this class.” (http://download.oracle.com/javase/6/docs/api/) Outras soluções da API: vector, arrays, stack, diversas variações de queue e de lista, entre outras.
  18. 18. http://publicationslist.org/junio Sorting  Como já mencionado em outra aula, a ordenação de coleções (listas) depende da definição de uma relação de ordem total entre seus elementos  Isso é possível usando-se a interface Comparable: public interface Comparable<T> { public int compareTo(T o); }  Uma vez implementada, pode-se ordenar uma dada coleção chamando-se o método estático public static void sort(List<T> list)
  19. 19. http://publicationslist.org/junio Sorting  Os tipos primitivos do Java implementam a interface Comparable em suas respectivas classes de boxing.
  20. 20. http://publicationslist.org/junio Sorting  Suponha o seguinte problema: você está usando objetos de uma classe da qual você não tem acesso ao código fonte, e esta classe não implementa a interface Comparable ou implementa diferentemente do que você deseja.  Se você quiser ordenar uma lista com os objetos desta classe, como fazer?  Para este problema, o Java oferece uma alternativa, a interface Comparator public interface Comparator<T> { int compare(T o1, T o2); }  Torna-se possível a definição de comparadores de objetos ao invés de objetos que são comparáveis entre si. public static void sort(List<T> list, Comparator<T> c)  Exemplo NetBeans  ComparatorTest e ListTest
  21. 21. http://publicationslist.org/junio Até aqui Listas (“conjuntos” COM repetição) e SEM restrições (acesso e remoção em posições aleatórias) • Array: ArrayList<E> • Lista encadeada: LinkedList<E> Listas (“conjuntos” COM repetição) e COM restrições (acesso e remoção apenas nas extremidades) • Array: ArrayDeque • Lista encadeada: LinkedList<E> • class Stack<E>: pilha • interface Queue<E>: fila • Pilha: push/pop • Fila: add/remove • Pilha: push/pop • Fila: add/remove Sets (conjuntos SEM repetição) Próximos slides
  22. 22. http://publicationslist.org/junio Sets
  23. 23. http://publicationslist.org/junio Set  A interface Set descende de Collection public interface Set<E> extends Collection<E>  Trata-se de um conjunto, matematicamente falando, sem repetição e sem ordem  Interface base para coleções que NÃO permitem repetição de elementos  Não pode haver dois elementos e1 e e2 tais que e1.equals(e2)  Não pode haver dois elementos com valor null
  24. 24. http://publicationslist.org/junio Implementações de Set  Existem três implementações diferentes, todas servem para o mesmo fim, mas com desempenho e requisitos diferentes:  HashSet: usa um hash para oferecer tempo constante, idealmente O(1), para operações (add, remove, contains e size); requer que equals e hashCode sejam sobreescritos – não mantém nenhuma ordem, melhor desempenho  LinkedHashSet: semelhante ao HashSet, usa também uma lista encadeada para manter a ordem dos elementos de acordo com a ordem de entrada  TreeSet: requer que a interface Comparable seja implementada – ordena pelo valor dos elementos mantendo-os em uma árvore binária de busca (não usa hash) – pior desempenho, mas provê ordenação simplificada  Como o HashSet evita repetições? Caso dois elementos possuam o mesmo código hash, prossegue para a comparação com o método equals. Portanto, deve-se sobreescrever tanto o método equals quanto o hashCode  Exemplo NetBeans  SetTest
  25. 25. http://publicationslist.org/junio Até aqui Listas (“conjuntos” COM repetição) e SEM restrições (acesso e remoção em posições aleatórias) • Array: ArrayList<E> • Lista encadeada: LinkedList<E> Listas (“conjuntos” COM repetição) e COM restrições (acesso e remoção apenas nas extremidades) • Array: ArrayDeque • Lista encadeada: LinkedList<E> • class Stack<E>: pilha • interface Queue<E>: fila • Pilha: push/pop • Fila: add/remove • Pilha: push/pop • Fila: add/remove Sets (conjuntos SEM repetição) • HashSet • LinkedHashSet • TreeSet
  26. 26. http://publicationslist.org/junio Maps
  27. 27. http://publicationslist.org/junio Map  Map é um conceito amplamente usado em ciência da computação, refere-se ao mapeamento entre chaves e valores  Map é uma parte do arcabouço de coleções, mas que não descende de Collection, mas sim da interface Map public interface Map<K,V>  Modela o conceito matemático de função, isto é:  as chaves não possuem repetição  uma dada chave mapeia exatamente um valor
  28. 28. http://publicationslist.org/junio Map  A interface public interface Map<K,V> { // Basic operations V put(K key, V value); V get(Object key); V remove(Object key); boolean containsKey(Object key); boolean containsValue(Object value); ... // Collection Views public Set<K> keySet(); //as chaves sem repetição, determinam um conjunto public Collection<V> values(); //já os valores, determinam apenas uma coleção ... }
  29. 29. http://publicationslist.org/junio Até aqui Listas (“conjuntos” COM repetição) e SEM restrições (acesso e remoção em posições aleatórias) • Array: ArrayList<E> • Lista encadeada: LinkedList<E> Listas (“conjuntos” COM repetição) e COM restrições (acesso e remoção apenas nas extremidades) • Array: ArrayDeque • Lista encadeada: LinkedList<E> • class Stack<E>: pilha • interface Queue<E>: fila • Pilha: push/pop • Fila: add/remove • Pilha: push/pop • Fila: add/remove Sets (conjuntos SEM repetição) • HashSet • LinkedHashSet • TreeSet Mapas (definem o conceito matemático de função*) • HashMap • LinkedHashMap • TreeMap *com a diferença de que o contra-domínio (valores) não é necessariamente um conjunto
  30. 30. http://publicationslist.org/junio Até aqui Listas (“conjuntos” COM repetição) e SEM restrições (acesso e remoção em posições aleatórias) • Array: ArrayList<E> • Lista encadeada: LinkedList<E> Listas (“conjuntos” COM repetição) e COM restrições (acesso e remoção apenas nas extremidades) • Array: ArrayDeque • Lista encadeada: LinkedList<E> • class Stack<E>: pilha • interface Queue<E>: fila • Pilha: push/pop • Fila: add/remove • Pilha: push/pop • Fila: add/remove Sets (conjuntos SEM repetição) • HashSet • LinkedHashSet • TreeSet Mapas (definem o conceito matemático de função*) • HashMap • LinkedHashMap • TreeMap *com a diferença de que o contra-domínio (valores) não é necessariamente um conjunto Os sets podem ser considerados casos especiais de maps nos quais o valor mapeado por uma chave é o próprio valor da chave.
  31. 31. http://publicationslist.org/junio Implementações de Map  Assim como Set, possui três implementações diferentes:  HashMap, LinkedHashMap e TreeMap Estas implementações possuem as mesmas implicações que as de Set.  Exemplo NetBeans  MapsTest
  32. 32. http://publicationslist.org/junio Wildcards – coleção de alguma coisa
  33. 33. http://publicationslist.org/junio Wildcards  Suponha o seguinte problema: você possui uma hierarquia de classes Pessoa / Aluno Professor  Você possui coleções ArrayList tanto de Alunos quanto de Professores  E você deseja escrever um método que imprime o conteúdo destas coleções, seja lá qual o seu conteúdo  Pode-se pensar na seguinte solução public void printCollection(ArrayList<Pessoa> umaColecao){ for(Pessoa o : umaColecao) System.out.println(o.getNome()); }  Funciona?
  34. 34. http://publicationslist.org/junio Wildcards  Resposta: não funciona  Apesar da hierarquia de classes, para o compilador não há relação nenhuma entre as diferentes definições: ArrayList<Pessoa> ≠ ArrayList<Aluno> ≠ ArrayList<Professor>  Desta maneira, o método só compila se receber exatamente um ArrayList<Pessoa>  Como proceder então?  Usar WildCard  O código ficaria então: public void printCollection(ArrayList<?> umaColecao){ for(Pessoa o : umaColecao) System.out.println(o.getNome()); }
  35. 35. http://publicationslist.org/junio Wildcards  O código ficaria então: public void printCollection(ArrayList<?> umaColecao){ for(Pessoa o : umaColecao) System.out.println(o.getNome()); }  Ok, mas e se alguém passasse alguma coisa que não é Pessoa? Por exemplo, ArrayList<Double>?  Haveria problema de execução, pois Double não possui um método getNome  Solução, limitar o wildcard; ficaria assim: public void printCollection(ArrayList<? extends Pessoa> umaColecao){ for(Pessoa o : umaColecao) System.out.println(o.getNome()); }  Seriam aceitos ArrayList<Pessoa>, ArrayList<Aluno> e ArrayList<Professor>
  36. 36. http://publicationslist.org/junio Wildcards  Solução, limitar o wildcard, ficaria assim: public void printCollection(ArrayList<? extends Pessoa> umaColecao){ for(Pessoa o : umaColecao) System.out.println(o.getNome()); }  Seriam aceitos ArrayList<Pessoa>, ArrayList<Aluno> e ArrayList<Professor>  “? extends” é denominado upper bound wildcard  Mas, e se por alguma razão fosse desejado que apenas Professor e Pessoa pudessem ser aceitos?  A solução poderia ficar assim public void printCollection(ArrayList<? super Professor> umaColecao){ for(Pessoa o : umaColecao) System.out.println(o.getNome()); }  Seriam aceitos ArrayList<Professor>, ArrayList<Pessoa>  “? super” é denominado lower bound wildcard

×