SlideShare uma empresa Scribd logo
®            TM
 Certificação Sun para Programador Java 6




                                   Collections



Tomaz Lavieri
Sun Certified Java Programmer 6
tomazlavieri@gmail.com
http://java-i9se.blogspot.com.br
Collections
Objetivos:
• Ao final desta apresentação espera-se que você
  saiba:
  – Distinguir cada tipo de Coleção.
  – Escolher a melhor implementação de Coleção para
    cada tipo de uso.
  – Saber a diferença entre as Interfaces: Collection, Set,
    Queue, List, SortedSet, NavigableSet, Map,
    SortedMap e NavigableMap.
  – Conhecer as implementações básicas: ArrayList,
    Vector, LinkedList, PriorityQueue, TreeSet, HashSet,
    LinkedHashSet, TreeMap, HashMap e
    LinkedHashMap.
Collections
Objetivos:
• Ao final desta apresentação espera-se que você
  saiba:
  – Distinguir cada tipo de Coleção.
  – Escolher a melhor implementação de Coleção para
    cada tipo de uso.
  – Saber a diferença entre as Interfaces: Collection, Set,
    Queue, List, SortedSet, NavigableSet, Map,
    SortedMap e NavigableMap.
  – Conhecer as implementações básicas: ArrayList,
    Vector, LinkedList, PriorityQueue, TreeSet, HashSet,
    LinkedHashSet, TreeMap, HashMap e
    LinkedHashMap.
Collections
Objetivos:
• Ao final desta apresentação espera-se que você
  saiba:
  – Distinguir cada tipo de Coleção.
  – Escolher a melhor implementação de Coleção (entre
    as básicas) para cada tipo de uso.
  – Saber a diferença entre as Interfaces: Collection, Set,
    Queue, List, SortedSet, NavigableSet, Map,
    SortedMap e NavigableMap.
  – Conhecer as implementações básicas: ArrayList,
    Vector, LinkedList, PriorityQueue, TreeSet, HashSet,
    LinkedHashSet, TreeMap, HashMap e
    LinkedHashMap.
Collections
Objetivos:
• Ao final desta apresentação espera-se que você
  saiba:
  – Distinguir cada tipo de Coleção.
  – Escolher a melhor implementação de Coleção (entre
    as básicas) para cada tipo de uso.
  – Saber a diferença entre as Interfaces: Collection, Set,
    Queue, List, SortedSet, NavigableSet, Map,
    SortedMap e NavigableMap.
  – Conhecer as implementações básicas: ArrayList,
    Vector, LinkedList, PriorityQueue, TreeSet, HashSet,
    LinkedHashSet, TreeMap, HashMap e
    LinkedHashMap.
Collections
Objetivos:
• Ao final desta apresentação espera-se que você
  saiba:
  – Distinguir cada tipo de Coleção.
  – Escolher a melhor implementação de Coleção (entre
    as básicas) para cada tipo de uso.
  – Saber a diferença entre as Interfaces: Collection, Set,
    Queue, List, SortedSet, NavigableSet, Map,
    SortedMap e NavigableMap.
  – Conhecer as implementações básicas: ArrayList,
    Vector, LinkedList, PriorityQueue, TreeSet, HashSet,
    LinkedHashSet, TreeMap, HashMap e
    LinkedHashMap.
Collections
• Pre-requisitos:
Collections
• Pre-requisitos:
  – Igualdade: Para se trabalhar com coleções é
    preciso entender a igualdade em Java
Collections
• Pre-requisitos:
  – Igualdade: Para se trabalhar com coleções é
    preciso entender a igualdade em Java
• Porque é preciso?
Collections
• Pre-requisitos:
  – Igualdade: Para se trabalhar com coleções é
    preciso entender a igualdade em Java
• Porque é preciso?
  – Quando chegarmos lá tudo ficará mais claro,
    mas adiantando, varias funcionalidades de
    coleções como contains(Object o) – que
    verifica se existe um objeto na coleção –
    precisa testar a igualdade para funcionar.
Collections
• Como funciona igualdade em Java ?
  pessoa1 == pessoa2
Collections
• Como funciona igualdade em Java ?
  pessoa1 == pessoa2
• Isso irá testar apenas se as duas variáveis
  referenciam uma única instancia!
Collections
• Como então saber, por exemplo, quando
  dois objetos Pessoa são significantemente
  iguais?
Collections
• Como então saber, por exemplo, quando
  dois objetos Pessoa são significantemente
  iguais?
  – Para esse tipo de teste você deve usar um
    método que todo objeto Java tem
    equals(Object o)
Collections
• Como então saber, por exemplo, quando
  dois objetos Pessoa são significantemente
  iguais?
  – Para esse tipo de teste você deve usar um
    método que todo objeto Java tem
    equals(Object o)
• Então nosso teste de igualdade seria:
  pessoa1.equals(pessoa2)
Collections
• Só isso resolve?
Collections
• Só isso resolve?
  – Não
Collections
• Só isso resolve?
  – Não
• Por padrão o método equals de Object faz
  o mesmo que o operador ==
Collections
• Só isso resolve?
  – Não
• Por padrão o método equals de Object faz
  o mesmo que o operador ==
  public class Object {
    //..
    public boolean equals(Object obj) {
       return (this == obj);
   }
   //…
Collections
• Então se queremos definir em nosso
  modelo que dois objetos Pessoa são
  iguais quando, por exemplo, seus cpf são
  iguais?
Collections
• Então se queremos definir em nosso
  modelo que dois objetos Pessoa são
  iguais quando, por exemplo, seus cpf são
  iguais?
  – Neste caso nós precisamos ensinar ao nosso
    programa a igualdade entre nossos objetos
Collections
• Então se queremos definir em nosso
  modelo que dois objetos Pessoa são
  iguais quando, por exemplo, seus cpf são
  iguais?
  – Neste caso nós precisamos ensinar ao nosso
    programa a igualdade entre nossos objetos
• Como fazer isso??
Collections
• Então se queremos definir em nosso
  modelo que dois objetos Pessoa são
  iguais quando, por exemplo, seus cpf são
  iguais?
  – Neste caso nós precisamos ensinar ao nosso
    programa a igualdade entre nossos objetos
• Como fazer isso??
  – Sobrescrevendo o equals
Collections
• Mas não basta simplesmente
  sobrescrever!
Collections
• Mas não basta simplesmente
  sobrescrever!
• E existe um contrato de equals que
  deve ser rigorosamente seguido para o
  bom funcionamento do programa e da
  Java Collections Framework
Collections
• O contrato diz que equals é:
  – Reflexível: a.equals(a) == true
  – Simétrico: a.equals(b) == b.equals(a)
  – Transitivo: se a.equals(b) && b.equals(c) == true .:.
                 a.equals(c) também é true.
  – Consistente: a.equals(b) deve retornar sempre true
    ou sempre falso, desde que nenhuma propriedade do
    do Objeto que faz parte do teste equals seja alterada.
  – Deve retornar false quando testado contra
    uma variável null
Collections
• O contrato diz que equals é:
  – Reflexível: a.equals(a) == true
  – Simétrico: a.equals(b) == b.equals(a)
  – Transitivo: se a.equals(b) && b.equals(c) == true .:.
                 a.equals(c) também é true.
  – Consistente: a.equals(b) deve retornar sempre true
    ou sempre falso, desde que nenhuma propriedade do
    do Objeto que faz parte do teste equals seja alterada.
  – Deve retornar false quando testado contra
    uma variável null
Collections
• O contrato diz que equals é:
  – Reflexível: a.equals(a) == true
  – Simétrico: a.equals(b) == b.equals(a)
  – Transitivo: se a.equals(b) && b.equals(c) == true .:.
                 a.equals(c) também é true.
  – Consistente: a.equals(b) deve retornar sempre true
    ou sempre falso, desde que nenhuma propriedade do
    do Objeto que faz parte do teste equals seja alterada.
  – Deve retornar false quando testado contra
    uma variável null
Collections
• O contrato diz que equals é:
  – Reflexível: a.equals(a) == true
  – Simétrico: a.equals(b) == b.equals(a)
  – Transitivo: se a.equals(b) && b.equals(c) == true .:.
                 a.equals(c) == true.
  – Consistente: a.equals(b) deve retornar sempre true
    ou sempre falso, desde que nenhuma propriedade do
    do Objeto que faz parte do teste equals seja alterada.
  – Deve retornar false quando testado contra
    uma variável null
Collections
• O contrato diz que equals é:
  – Reflexível: a.equals(a) == true
  – Simétrico: a.equals(b) == b.equals(a)
  – Transitivo: se a.equals(b) && b.equals(c) == true .:.
                 a.equals(c) == true
  – Consistente: a.equals(b) deve retornar sempre true
    ou sempre falso, desde que nenhuma propriedade do
    do Objeto que faz parte do teste equals seja alterada.
  – Deve retornar false quando testado contra
    uma variável null
Collections
• Portanto para nossa classe Pessoa podemos
  definir um equals assim:
  public class Pessoa {
    private String cpf;
    //...
    @Override
    public boolean equals(Object p) {
       if (cpf == null)
          return false;
       return (p instanceof Pessoa) &&
          this.cpf.equals(((Pessoa)p).cpf);
    }
    //...
  }
Collections
• Portanto para nossa classe Pessoa podemos
  definir um equals assim:
  public class Pessoa {
    private String cpf;
    //...
    @Override // não é necessário mas é bom
    public boolean equals(Object p) {
       if (cpf == null)
          return false;
       return (p instanceof Pessoa) &&
          this.cpf.equals(((Pessoa)p).cpf);
    }
    //...
  }
Collections
• Portanto para nossa classe Pessoa podemos
  definir um equals assim:    Eu não podia colocar
   public class Pessoa {              A classe Pessoa?
     private String cpf;              No lugar de Objeto ?
     //...
     @Override
     public boolean equals(Object p) {
                               Pessoa
        if (cpf == null)
           return false;
        return (p instanceof Pessoa) &&
           this.cpf.equals(((Pessoa)p).cpf);
     }
     //...
   }
Collections
• Portanto para nossa classe Pessoa podemos
  definir um equals assim:    Eu não podia colocar
   public class Pessoa {              A classe Pessoa?
     private String cpf;              No lugar de Objeto ?
     //...
     @Override
     public boolean equals(Object p) {
                               Pessoa
        if (cpf == null)                         NÃO!!!!
           return false;                         Pois é preciso
        return (p instanceof Pessoa) &&          sobrescrever o
           this.cpf.equals(((Pessoa)p).cpf);     método da classe
     }                                           Object e portanto
     //...                                       manter a mesma
   }                                             assinatura
Collections
• Então é isso basta sobrescrever o método
  equals corretamente na minha classe e já
  posso usar:
  pessoa1.equals(pessoa2)
• Não preciso fazer mais nada?
Collections
• Então é isso basta sobrescrever o método
  equals corretamente na minha classe e já
  posso usar:
  pessoa1.equals(pessoa2)
• Não preciso fazer mais nada?
  – ERRADO! Precisa sim! E é ai o erro mais comum de
    quem trabalha com collections
Collections
• Então é isso basta sobrescrever o método
  equals corretamente na minha classe e já
  posso usar:
  pessoa1.equals(pessoa2)
• Não preciso fazer mais nada?
  – ERRADO! Precisa sim! E é ai o erro mais comum de
    quem trabalha com collections
• O contrato de equals(Object o) esta
  fortemente ligado ao de hashCode()
Collections
• E pra que serve esse hashCode() ?
Collections
• E pra que serve esse hashCode() ?
  – Calma que assim que chegar em coleções falaremos
    dele ao estudar HashSet, LinkedHashSet, HashMap,
    LinkedHashMap e Hashtable
Collections
• E pra que serve esse hashCode() ?
  – Calma que assim que chegar em coleções falaremos
    dele ao estudar HashSet, LinkedHashSet, HashMap,
    LinkedHashMap e Hashtable
• Certo mas então o que ele tem a ver com meu
  teste de igualdade ??
Collections
• E pra que serve esse hashCode() ?
  – Calma que assim que chegar em coleções falaremos
    dele ao estudar HashSet, LinkedHashSet, HashMap,
    LinkedHashMap e Hashtable
• Certo mas então o que ele tem a ver com meu
  teste de igualdade ??
  – As definições do contrato de hashCode() o ligam
    diretamente ao teste de igualdade, portanto sempre
    que sobrescrever equals(Object o) você terá que
    sobrescrever também o hashCode()
Collections
• O contrato do hashCode() diz:
  – É constante: qualquer chamada a hashCode() deve sempre
    retornar o mesmo interiro, desde que as propriedade usadas no
    teste equals(Object o) não sejam alteradas.
  – É igual para objetos iguais: a.equals(b) == true .:.
    a.hashCode() == b.hashCode()
  – Não é necessário ser diferente para objetos
    diferentes: ou seja, se a.equals(b) == false .:. a.hashCode()
    == b.hashCode() || hashCode() != b.hashCode()
Collections
• O contrato do hashCode() diz:
  – É constante: qualquer chamada a hashCode() deve sempre
    retornar o mesmo inteiro, desde que as propriedade usadas no
    teste equals(Object o) não sejam alteradas.
  – É igual para objetos iguais: a.equals(b) == true .:.
    a.hashCode() == b.hashCode()
  – Não é necessário ser diferente para objetos
    diferentes: ou seja, se a.equals(b) == false .:. a.hashCode()
    == b.hashCode() || hashCode() != b.hashCode()
Collections
• O contrato do hashCode() diz:
  – É constante: qualquer chamada a hashCode() deve sempre
    retornar o mesmo inteiro, desde que as propriedade usadas no
    teste equals(Object o) não sejam alteradas.
  – É igual para objetos iguais: a.equals(b) == true .:.
    a.hashCode() == b.hashCode()
  – Não é necessário ser diferente para objetos
    diferentes: ou seja, se a.equals(b) == false .:. a.hashCode()
    == b.hashCode() || hashCode() != b.hashCode()
Collections
• O contrato do hashCode() diz:
  – É constante: qualquer chamada a hashCode() deve sempre
    retornar o mesmo inteiro, desde que as propriedade usadas no
    teste equals(Object o) não sejam alteradas.
  – É igual para objetos iguais: a.equals(b) == true .:.
    a.hashCode() == b.hashCode()
  – Não é necessário ser diferente para objetos
    diferentes: ou seja, se a.equals(b) == false .:.
    a.hashCode() == b.hashCode() || hashCode() != b.hashCode()
Collections
• Por padrão o método hashCode() é
  diferente para cada instancia de Object.
• Não é implementado em java e sim com
  linguagem nativa:
  public class Object {
    //..
    public native int hashCode();
    //…
  }
Collections
• Por padrão o método hashCode() é
  diferente para cada instancia de Object.
• Não é implementado em java e sim com
  linguagem nativa:
  public class Object {
    //..
    public native int hashCode();
    //…
  }
Collections
• Portanto no nosso modelo dois objetos
  Pessoa com o mesmo cpf, vai retornar
  hashCode diferentes (pois esse é o
  padrão do hashCode)
• Isto fere o contrato de hashCode, pois:
  pessoa1.equals(pessoa2) == true
  pessoa1.hashCode() != pessoa2.hashCode()
Collections
• Portanto no nosso modelo dois objetos
  Pessoa com o mesmo cpf, vai retornar
  hashCode diferentes (pois esse é o
  padrão do hashCode)
• Isto fere o contrato de hashCode, pois:
  pessoa1.equals(pessoa2) == true
  pessoa1.hashCode() != pessoa2.hashCode()
Collections
   Pessoa p1 = new Pessoa("123.456.789-00"); //igual a p2
   String text = "São iguais? %b ... hashCodes? %d , %d n";
   for (int i = 0; i < 30; i++) {
      Pessoa p2 = new Pessoa("123.456.789-00"); //igual a p1
      System.out.printf( text, p1.equals(p2), p1.hashCode(),
                            p2.hashCode() );
   }
• O output disso é algo como:
   –   São iguais? true ... hashCodes? 11394033 , 4384790
   –   São iguais? true ... hashCodes? 11394033 , 24355087
   –   São iguais? true ... hashCodes? 11394033 , 5442986
   –   São iguais? true ... hashCodes? 11394033 , 10891203
   –   São iguais? true ... hashCodes? 11394033 , 9023134
   –   ....... etc
Collections
• Portanto para nossa classe Pessoa um
  hashCode() valido pode ser:
  public class Pessoa {
    private String cpf;
    //...
    @Override
    public int hashCode() {
       return (cpf == null) ? 0 : cpf.hashCode();
    }
    //...
  }
Collections
• Portanto para nossa classe Pessoa um
  hashCode() valido pode ser:
  public class Pessoa {
    private String cpf;
    //...
    @Override // não é necessário mas é bom
    public int hashCode() {
       return (cpf == null) ? 0 : cpf.hashCode();
    }
    //...
  }
Collections
• Portanto para nossa classe Pessoa um
  hashCode() valido pode ser:
  public class Pessoa {                Eu não poderia retornar
    private String cpf;                sempre o mesmo número?
                                       Isso não feriria o contrato!
    //...
    @Override
    public int hashCode() {
       return (cpf == null) ? 0 : cpf.hashCode();
               12;
    }
    //...
  }
Collections
• Portanto para nossa classe Pessoa um
  hashCode() valido pode ser:
  public class Pessoa {                Eu não poderia retornar
    private String cpf;                sempre o mesmo número?
                                       Isso não feriria o contrato!
    //...
    @Override
    public int hashCode() {
                                        SIM! Poderia...
       return (cpf == null) ? 0 : cpf.hashCode();nem um
               12;                      Porem não é
                                        pouco eficiente, como
    }                                   veremos mais adiante
    //...                               quando estudarmos as
                                        coleções que usam hash
  }
Collections
• Vamos ao que interesssa...
Collections
• Java Collections Framework (JCF)
  – Existem duas interfaces principais são elas:
    • java.util.Collection: uma coleção de objetos
    • java.util.Map: uma coleção de chave        objeto
  – Toda a estrutura da JCF é baseada e
    descendem da estrutura destas duas
    interfaces
Collections
• Java Collections Framework (JCF)
  – Existem duas interfaces principais são elas:
    • java.util.Collection: uma coleção de objetos
    • java.util.Map: uma coleção de chave        objeto
  – Toda a estrutura da JCF é baseada e
    descendem da estrutura destas duas
    interfaces
• Então como seria esta estrutura ??
Utilitários
Collections
• E eu preciso saber de tudo isso ????
Collections
• E eu preciso saber de tudo isso ????
  – SIM!!!!
Collections
• E eu preciso saber de tudo isso ????
  – SIM!!!! Para a certificação e para a vida de
    programador java!
Collections
• E eu preciso saber de tudo isso ????
  – SIM!!!! Para a certificação e para a vida de
    programador java!
• Mas... devagar com andor que o santo é
  de barro...
• Quais são as interfaces mesmo ??
Collections
• Interfaces da JFC
Collections
• Interfaces da JFC




• Ta bagunçado né ?? Vamos olhar isso
  direito, começando pela Collection!
Collections
• Métodos de java.util.Collection<E>:
   boolean add(E e)
   boolean addAll(Collection<? extends E> c)
   boolean contains(Object o)
   boolean containsAll(Collection<?> c)
   boolean remove(Object o)
   boolean removeAll(Collection<?> c)
   boolean retainAll(Collection<?> c)
   void clear()
   int size()
   boolean isEmpty()
   Object[] toArray()
   <T> T[] toArray(T[] a)
Collections
• Métodos de java.util.Collection<E>:
   boolean add(E e)
   boolean addAll(Collection<? extends E> c)
   boolean contains(Object o)
   boolean containsAll(Collection<?> c)          PERAI PERAI!!
   boolean remove(Object o)                    O que é esse <E> ?
   boolean removeAll(Collection<?> c)           e esse add(E e) ?
                                             e esse <? extends E> ?
   boolean retainAll(Collection<?> c)
                                                   e esse <?>
   void clear()
                                              e aquele <T> T[] ???
   int size()
   boolean isEmpty()
                                             Que classes são essas ?
   Object[] toArray()                               T e E ???
   <T> T[] toArray(T[] a)
Collections
• Métodos de java.util.Collection<E>:
   boolean add(E e)
   boolean addAll(Collection<? extends E> c)
   boolean contains(Object o)
   boolean containsAll(Collection<?> c)             PERAI PERAI!!
   boolean remove(Object o)                       O que é esse <E> ?
   boolean removeAll(Collection<?> c)              e esse add(E e) ?
                                                e esse <? extends E> ?
   boolean retainAll(Collection<?> c)
                                                      e esse <?>
   void clear()        Isso se chama genéricos!  e aquele <T> T[] ???
   int size()          Eu vou dar uma breve
   boolean isEmpty() explicação apenas
                       introdutória, e voltamos Que classes são essas ?
   Object[] toArray() para as Collections              T e E ???
   <T> T[] toArray(T[] a)
Collections
• O que são genéricos ?
  – Os genéricos são amarrações que só existem em
    tempo de compilação
  – Existem classes genéricas e métodos genéricos
• Para Collection vamos focar em classes
  genéricas, por exemplo:
  public class ArrayList<E> ... {
    boolean add(E e) {
      ...
    }
  }
Collections
• O que são genéricos ?
  – Os genéricos são amarrações que só existem em
    tempo de compilação
  – Existem classes genéricas e métodos genéricos
• Para Collection vamos focar em classes
  genéricas, por exemplo:
  public class ArrayList<E> ... {
    boolean add(E e) {
      ...
    }
  }
Collections
• O que são genéricos ?
  – Os genéricos são amarrações que só existem em
    tempo de compilação
  – Existem classes genéricas e métodos genéricos
• Para Collection vamos focar em classes
  genéricas... por exemplo:
  public class ArrayList<E> ... {
    boolean add(E e) {
      ...
    }
  }
Collections
• O que são genéricos ?
  – Os genéricos são amarrações que só existem em
    tempo de compilação
  – Existem classes genéricas e métodos genéricos
• Para Collection vamos focar em classes
  genéricas... por exemplo:
  public class ArrayList<E> ... {
    boolean add(E e) {
      ...
    }
  }
Collections
• O que acontece quando declaramos assim?
  ArrayList<String> strings = new ArrayList<String>();
• Para o compilador, e apenas para o compilador
  Todos os “T” viram “String”
  boolean add(String e);
• Porem para o bytecode o “T” é sempre Object,
  ou seja, depois que ta rodando o programa isso
  some e tudo vira Object novamente
  boolean add(Object e);
Collections
• O que acontece quando declaramos assim?
  ArrayList<String> strings = new ArrayList<String>();
• Para o compilador, e apenas para o compilador
  Todos os “T” viram “String”
  boolean add(String e);
• Porem para o bytecode o “T” é sempre Object,
  ou seja, depois que ta rodando o programa isso
  some e tudo vira Object novamente
  boolean add(Object e);
Collections
• O que acontece quando declaramos assim?
  ArrayList<String> strings = new ArrayList<String>();
• Para o compilador, e apenas para o compilador
  Todos os “T” viram “String”
  boolean add(String e);
• Porem para o bytecode o “T” é sempre Object,
  ou seja, depois que ta rodando o programa isso
  some e tudo vira Object novamente
  boolean add(Object e);
Collections
• E podemos criar a classe assim ??
  ArrayList c = new ArrayList();
Collections
• E podemos criar a classe assim ??
  ArrayList c = new ArrayList();
  SIM!!! podemos!!! E o método gerado fica assim
  boolean add(Object e);
Collections
• E podemos criar a classe assim ??
  ArrayList c = new ArrayList();
  SIM!!! podemos!!! E o método gerado fica assim
  boolean add(Object e);
• E na realidade a classe continua sendo
  desta forma, os tipos são apenas uma
  amarração para forçar a codar
  corretamente uma classe genérica.
Collections
• O problema esta quando você mistura
  genérico e não genérico:
  ArrayList<String> strings = new ArrayList<String>();
  ArrayList c = new ArrayList();
Collections
• O problema esta quando você mistura
  genérico e não genérico:
  ArrayList<String> strings = new ArrayList<String>();
  ArrayList c = new ArrayList();
• strings.add(a) só aceita Strings como
  argumento.
• c.add(a) aceita qualquer Object
• Por exemplo .... =>
Collections
• O problema esta quando você mistura
  genérico e não genérico:
  ArrayList<String> strings = new ArrayList<String>();
  ArrayList c = new ArrayList();
  c.add(new Object());
  strings.add(new Object());
  strings.add(“abc”);
Collections
• O problema esta quando você mistura
  genérico e não genérico:
  ArrayList<String> strings = new ArrayList<String>();
  ArrayList c = new ArrayList();
  c.add(new Object()); //   ok vai compilar
  strings.add(new Object());
  strings.add(“abc”);
Collections
• O problema esta quando você mistura
  genérico e não genérico:
  ArrayList<String> strings = new ArrayList<String>();
  ArrayList c = new ArrayList();
  c.add(new Object());
  strings.add(new Object()); //  não compila
  strings.add(“abc”);
Collections
• O problema esta quando você mistura
  genérico e não genérico:
  ArrayList<String> strings = new ArrayList<String>();
  ArrayList c = new ArrayList();
  c.add(new Object());
  strings.add(new Object());
  strings.add(“abc”); //  ok vai compilar
Collections
• O problema esta quando você mistura
  genérico e não genérico:
  ArrayList<String> strings = new ArrayList<String>();
  ArrayList c = new ArrayList();
  c.add(new Object()); //   ok vai compilar
  strings.add(new Object()); //   não compila
  strings.add(“abc”); //  ok vai compilar
Collections
• O problema esta quando você mistura
  genérico e não genérico:
  ArrayList<String> strings = new ArrayList<String>();
  ArrayList c = new ArrayList();
• Mas se você passar strings para c, você
  terá um problemão
Collections
• O problema esta quando você mistura
  genérico e não genérico:
  ArrayList<String> strings = new ArrayList<String>();
  ArrayList c = new ArrayList();
• Mas se você passar strings para c, você
  terá um problemão
  c = strings;
  c.add(new Object()); //   compila NÃO gera Exception
Collections
• O problema esta quando você mistura
  genérico e não genérico:
  ArrayList<String> strings = new ArrayList<String>();
  ArrayList c = new ArrayList();
• Mas se você passar strings para c, você
  terá um problemão
  c = strings; // ok compila MAS É PERIGOSO!
  c.add(new Object()); // compila NÃO gera Exception
Collections
• O problema esta quando você mistura
  genérico e não genérico:
  ArrayList<String> strings = new ArrayList<String>();
  ArrayList c = new ArrayList();
• Mas se você passar strings para c, você
  terá um problemão
  c = strings; // ok compila MAS É PERIGOSO!
  c.add(new Object()); // compila NÃO gera Exception
Collections
• O problema esta quando você mistura
  genérico e não genérico:
  ArrayList<String> strings = new ArrayList<String>();
  ArrayList c = new ArrayList();
• Mas se você passar strings para c, você
  terá um problemão
  c = strings; // ok compila MAS É PERIGOSO!
  c.add(new Object()); // compila NÃO gera Exception
Collections
• O problema esta quando você mistura
  genérico e não genérico:
  ArrayList<String> strings = new ArrayList<String>();
  ArrayList c = new ArrayList();
• Mas se você passar strings para c, você
  terá um problemão
  c = strings; // ok compila MAS É PERIGOSO!
  c.add(new Object()); // compila NÃO gera Exception
Collections
• O problema esta quando você mistura
  genérico e não genérico:
                              Neste momento a collection strings
  ArrayList<String> strings = new ArrayList<String>(); mesmo
                               passou a conter um Object
  ArrayList c = new ArrayList(); sua tipagem impedindo isso,
                               a
                              isso pode ocorrer quando generico
• Mas se você passar tString para t, você
                              é misturado com não genericos

  terá um problemão
  c = strings; // ok compila MAS É PERIGOSO!
  c.add(new Object()); // compila NÃO gera Exception
Collections
• A Sun aconselha sempre usar os
  genéricos:
• Os códigos que não usam genérico
  quando as classes o definem compilam,
  mas geram warnings avisando que pode
  dar problema.
Collections
• Mas perai e aqueles <?> o que é essa “?”
  – Isso é um operador curinga ela funciona
    quando você quer falar que aceita uma classe
    com qualquer tipagem.
• Então:
  Teste<?> tGenerico = new Teste<String>();
  É o mesmo que ??
  Teste tGenerico = new Teste<String>();
  NÃO!! São diferentes!
Collections
• Mas perai e aqueles <?> o que é essa “?”
  – Isso é um operador curinga ela funciona
    quando você quer falar que aceita uma classe
    com qualquer tipagem.
• Então:
  Teste<?> tGenerico = new Teste<String>();
  É o mesmo que ??
  Teste tGenerico = new Teste<String>();
  NÃO!! São diferentes!
Collections
• Mas perai e aqueles <?> o que é essa “?”
  – Isso é um operador curinga ela funciona
    quando você quer falar que aceita uma classe
    com qualquer tipagem.
• Então:
  ArrayList<?> c = new ArrayList<String>();
  É o mesmo que ??
  ArrayList c = new ArrayList<String>();
  NÃO!! São diferentes!
Collections
• Mas perai e aqueles <?> o que é essa “?”
  – Isso é um operador curinga ela funciona
    quando você quer falar que aceita uma classe
    com qualquer tipagem.
• Então:
  ArrayList<?> c = new ArrayList<String>();
  É o mesmo que ??
  ArrayList c = new ArrayList<String>();
  NÃO!! São diferentes!
Collections
• Quando você usa o operador <?> você
  não pode mandar objetos para os
  métodos tipados, por exemplo:
  c.add(a); //   não compila
• Todos os outros métodos, que não tem o
  T, funcionam, portanto deve ser usando
  quando você quer usar o objeto sem
  passar objetos tipados, por exemplo:
  c.size(); //   funciona normalmente
Collections
• Tá ... e porque não compila ??
  – O motivo é porque você não sabe que tipo de
    coleção você esta trabalhando
• Por exemplo:
  List<?> lista;
  //eu posso adcionar qualquer lista ai
  lista = new ArrayList<String>();
  lista = new ArrayList<Integer>();
  lista = new ArrayList<Thread>();
• Então quando você só sabe da list
• /
Collections
• Tá ... e porque não compila ??
  – O motivo é porque você não sabe que tipo de
    coleção você esta trabalhando
• Por exemplo:
  List<?> lista;
  //eu posso adcionar qualquer lista ai
  lista = new ArrayList<String>();
  lista = new ArrayList<Integer>();
  lista = new ArrayList<Thread>();
• Então quando você só sabe da list
• /
Collections
• Tá ... e porque não compila ??
  – O motivo é porque você não sabe que tipo de
    coleção você esta trabalhando
• Por exemplo:
  List<?> lista;
  //eu posso adcionar qualquer lista ai
  lista = new ArrayList<String>();
  lista = new ArrayList<Integer>();
  lista = new ArrayList<Thread>();
• Então quando você só sabe da list
• /
Collections
• Tá ... e porque não compila ??
  – O motivo é porque você não sabe que tipo de
    coleção você esta trabalhando
• Por exemplo:
  List<?> lista;
  //eu posso adcionar qualquer lista ai
  lista = new ArrayList<String>();
  lista = new ArrayList<Integer>();
  lista = new ArrayList<Thread>();
• Então quando você só sabe da list
• /
Collections
• Tá ... e porque não compila ??
  – O motivo é porque você não sabe que tipo de
    coleção você esta trabalhando
• Por exemplo:
  List<?> lista;
  //eu posso adcionar qualquer lista ai
  lista = new ArrayList<String>();
  lista = new ArrayList<Integer>();
  lista = new ArrayList<Thread>();
• Então quando você não sabe o tipo
• /
Collections
• Tá ... e porque não compila ??
  – O motivo é porque você não sabe que tipo de
    coleção você esta trabalhando
• Por exemplo:
  List<?> lista = getList();
• Você não poderá saber o que essa lista aceita:
  lista.add(“Texto”); //e se for uma lista de Thread ?
• Porem você pode usar os métodos não tipados
  lista.contains(“Texto”);
  lista.remove(33);
  lista.size();
Collections
• Tá ... e porque não compila ??
  – O motivo é porque você não sabe que tipo de
    coleção você esta trabalhando
• Por exemplo:
  List<?> lista = getList();
• Você não poderá saber o que essa lista aceita:
  lista.add(“Texto”); //e se for uma lista de Thread ?
• Porem você pode usar os métodos não tipados
  lista.contains(“Texto”);
  lista.remove(33);
  lista.size();
Collections
• Tá ... e porque não compila ??
  – O motivo é porque você não sabe que tipo de
    coleção você esta trabalhando
• Por exemplo:
  List<?> lista = getList();
• Você não poderá saber o que essa lista aceita:
  lista.add(“Texto”); //e se for uma lista de Thread ?
• Porem você pode usar os métodos não tipados
  lista.contains(“Texto”);
  lista.remove(33);
  lista.size();
Collections
• Tá ... e porque não compila ??
  – O motivo é porque você não sabe que tipo de
    coleção você esta trabalhando
• Por exemplo:
  List<?> lista = getList();
• Você não poderá saber o que essa lista aceita:
  lista.add(“Texto”); //e se for uma lista de Thread ?
• Porem você pode usar os métodos não tipados
  lista.contains(“Texto”);
  lista.remove(33);
  lista.size();
Collections
• Tá ... e porque não compila ??
  – O motivo é porque você não sabe que tipo de
    coleção você esta trabalhando
• Por exemplo:
  List<?> lista = getList();
• Você não poderá saber o que essa lista aceita:
  lista.add(“Texto”); //e se for uma lista de Thread ?
• Porem você pode usar os métodos não tipados
  lista.contains(“Texto”);
  Object o = lista.get(4); //n sei o tipo da lista .:. n sei o retorno
  lista.size();
Collections
• Tá ... e porque não compila ??
  – O motivo é porque você não sabe que tipo de
    coleção você esta trabalhando
• Por exemplo:
  List<?> lista = getList();
• Você não poderá saber o que essa lista aceita:
  lista.add(“Texto”); //e se for uma lista de Thread ?
• Porem você pode usar os métodos não tipados
  lista.contains(“Texto”);
  Object o = lista.get(4); //n sei o tipo da lista .:. n sei o retorno
  lista.size();
Collections
• Ta e aquele <? extends T> ?:
  – Ele funciona como uma sub categoria... por exemplo:
  ArrayList<Number> numbers = new ArrayList<Number>();
• O método addAll nesse caso fica
  boolean addAll(Collection<? extends Number> c);
• E assim é possivel adcionar a numbers qualquer
  coleção tipado como Number ou por de suas
  subclasse.
  ArrayList<Integer> integers = new ArrayList<Integer>();
  integers.add(12); integers.add(15);
  numbers.addAll(integers); //pois os inteiros também são Number
Collections
• Ta e aquele <? extends T> ?:
  – Ele funciona como uma sub categoria... por exemplo:
  ArrayList<Number> numbers = new ArrayList<Number>();
• O método addAll nesse caso fica
  boolean addAll(Collection<? extends Number> c);
• E assim é possivel adcionar a numbers qualquer
  coleção tipado como Number ou por de suas
  subclasse.
  ArrayList<Integer> integers = new ArrayList<Integer>();
  integers.add(12); integers.add(15);
  numbers.addAll(integers); //pois os inteiros também são Number
Collections
• Ta e aquele <? extends T> ?:
  – Ele funciona como uma sub categoria... por exemplo:
  ArrayList<Number> numbers = new ArrayList<Number>();
• O método addAll nesse caso fica
  boolean addAll(Collection<? extends Number> c);
• E assim é possivel adcionar a numbers qualquer
  coleção tipado como Number ou por de suas
  subclasse.
  ArrayList<Integer> integers = new ArrayList<Integer>();
  integers.add(12); integers.add(15);
  numbers.addAll(integers); //pois os inteiros também são Number
Collections
• Ta e aquele <? extends T> ?:
  – Ele funciona como uma sub categoria... por exemplo:
  ArrayList<Number> numbers = new ArrayList<Number>();
• O método addAll nesse caso fica
  boolean addAll(Collection<? extends Number> c);
• E assim é possivel adcionar a numbers qualquer
  coleção tipado como Number ou por de suas
  subclasse.
  ArrayList<Integer> integers = new ArrayList<Integer>();
  integers.add(12); integers.add(15);
  numbers.addAll(integers); //pois os inteiros também são Number
Collections
• Ta e aquele <? extends T> ?:
  – Ele funciona como uma sub categoria... por exemplo:
  ArrayList<Number> numbers = new ArrayList<Number>();
• O método addAll nesse caso fica
  boolean addAll(Collection<? extends Number> c);
• E assim é possível adicionar a numbers
  qualquer coleção tipado como Number ou por
  uma de suas subclasse.
  ArrayList<Integer> integers = new ArrayList<Integer>();
  integers.add(12); integers.add(15);
  numbers.addAll(integers); //pois os inteiros também são Number
Collections
• Ta e aquele <? extends T> ?:
  – Ele funciona como uma sub categoria... por exemplo:
  ArrayList<Number> numbers = new ArrayList<Number>();
• O método addAll nesse caso fica
  boolean addAll(Collection<? extends Number> c);
• E assim é possível adicionar a numbers
  qualquer coleção tipado como Number ou por
  uma de suas subclasse.
  ArrayList<Integer> integers = new ArrayList<Integer>();
  integers.add(12); integers.add(15);
  numbers.addAll(integers); //pois os inteiros também são Number
Collections
                               Espera um pouco!
• Ta e aquele <? extends T> ?:
                         É realmente necessário isso ??
   – Ele funciona como uma sub categoria... por exemplo:
                                    E se eu fizesse assim?
   ArrayList<Number> numbers = new ArrayList<Number>();
• O método addAll nesse caso fica
   boolean addAll(Collection<? extends Number> c);
• E assim é possível adicionar a numbers
  qualquer coleção tipado como Number ou por
  uma de suas subclasse.
   ArrayList<Integer> integers = new ArrayList<Integer>();
   integers.add(12); integers.add(15);
   numbers.addAll(integers); //pois os inteiros também são Number
Collections
                               Espera um pouco!
• Ta e aquele <? extends T> ?:
                         É realmente necessário isso ??
   – Ele funciona como uma sub categoria... por exemplo:
                                    E se eu fizesse assim?
   ArrayList<Number> numbers = new ArrayList<Number>();
• O método addAll nesse caso fica
   boolean addAll(Collection<? extends Number> c);
• E assim é possível adicionar a numbers
  qualquer coleção tipado como Number ou por
  uma de SIM!!! Ésubclasse.
         suas SIM!
   ArrayList<Integer> integers = new ArrayList<Integer>();
       Isso não será como você
   integers.add(12); integers.add(15);
       Espera, deixa eu explicar
   numbers.addAll(integers); //pois os inteiros também são Number
               melhor
Collections
                               Espera um pouco!
• Ta e aquele <? extends T> ?:
                         É realmente necessário isso ??
   – Ele funciona como uma sub categoria... por exemplo:
                                     E se eu fizer assim?
   ArrayList<Number> numbers = new ArrayList<Number>();
• O método addAll nesse caso fica
   boolean addAll(Collection<? extends Number> c);
• E assim é possível adicionar a numbers
                     (Collection<Number> c)
  qualquer coleção tipado como Number ou por
  uma de SIM!!! Ésubclasse.
         suas SIM!
   ArrayList<Integer> integers = new ArrayList<Integer>();
       Isso não será como você
   integers.add(12); integers.add(15);
       Espera, deixa eu explicar
   numbers.addAll(integers); //pois os inteiros também são Number
               melhor
Collections
                               Espera um pouco!
• Ta e aquele <? extends T> ?:
                         É realmente necessário isso ??
   – Ele funciona como uma sub categoria... por exemplo:
                                     E se eu fizer assim?
   ArrayList<Number> numbers = new ArrayList<Number>();
• O método addAll nesse caso fica
   boolean addAll(Collection<? extends Number> c);
• E assim é possível adicionar a numbers
                     (Collection<Number> c)
  qualquer coleção tipado como Number ou por
  uma de SIM!!! Ésubclasse.
         suas SIM!
   ArrayList<Integer> integers = new ArrayList<Integer>();
       Isso não será como você
   integers.add(12); integers.add(15);
       espera, deixa eu explicar
   numbers.addAll(integers); //pois os inteiros também são Number
               melhor
Collections
   ArrayList<Number> list;
• Isso quer dizer que list só pode receber o tipo
  Number... por exemplo:
   list = new ArrayList<Integer>(); //NÃO compila
   list = new ArrayList<Number>(); //compila
• Para ser qualquer sub-tipo de number é preciso
  fazer
   ArrayList<? extends Number> list;
   list = new ArrayList<Integer>(); //agora compila
• E qual o retorno para list.get(0) ??
   Number n = list.get(0); //O retorno é um Number!
Collections
   ArrayList<Number> list;
• Isso quer dizer que list só pode receber o tipo
  Number... por exemplo:
   list = new ArrayList<Integer>(); //    NÃO compila
   list = new ArrayList<Number>(); //    compila
• Para ser qualquer sub-tipo de number é preciso
  fazer
   ArrayList<? extends Number> list;
   list = new ArrayList<Integer>(); //agora compila
• E qual o retorno para list.get(0) ??
   Number n = list.get(0); //O retorno é um Number!
Collections
   ArrayList<Number> list;
• Isso quer dizer que list só pode receber o tipo
  Number... por exemplo:
   list = new ArrayList<Integer>(); //    NÃO compila
   list = new ArrayList<Number>(); //    compila
• Para ser qualquer sub-tipo de Number é preciso
  fazer
   ArrayList<? extends Number> list;
   list = new ArrayList<Integer>(); //agora compila
• E qual o retorno para list.get(0) ??
   Number n = list.get(0); //O retorno é um Number!
Collections
   ArrayList<Number> list;
• Isso quer dizer que list só pode receber o tipo
  Number... por exemplo:
   list = new ArrayList<Integer>(); //    NÃO compila
   list = new ArrayList<Number>(); //    compila
• Para ser qualquer sub-tipo de Number é preciso
  fazer
   ArrayList<? extends Number> list;
   list = new ArrayList<Integer>(); //agora compila
• E qual o retorno para list.get(0) ??
   Number n = list.get(0); //O retorno é um Number!
Collections
• Ta e aquele <T> T[] toArray(T[] a)?:
Collections
• Ta e aquele <T> T[] toArray(T[] a)?:
  – Esse é um método generico, e não usa
    tipagem da classe mas sim do método
Collections
• Ta e aquele <T> T[] toArray(T[] a)?:
  – Esse é um método generico, e não usa
    tipagem da classe mas sim do método
• Este método quer dizer que o retorno dele
  é uma array do tipo “T” que é o mesmo
  tipo da array enviada no argumento,
  portanto
  nums.toArray(new Number[])
  nums.toArray(new Integer[])
Collections
• Ta e aquele <T> T[] toArray(T[] a)?:
  – Esse é um método generico, e não usa
    tipagem da classe mas sim do método
• Este método quer dizer que o retorno dele
  é uma array do tipo “T” que é o mesmo
  tipo da array enviada no argumento,
  portanto
  nums.toArray(new Number[]) //   retorna um Number[]
  nums.toArray(new Integer[])
Collections
• Ta e aquele <T> T[] toArray(T[] a)?:
  – Esse é um método generico, e não usa
    tipagem da classe mas sim do método
• Este método quer dizer que o retorno dele
  é uma array do tipo “T” que é o mesmo
  tipo da array enviada no argumento,
  portanto
  nums.toArray(new Number[])
  nums.toArray(new Integer[]) //   retorna um Integer[]
Collections
• Tem mais coisas que preciso saber sobre
  Genéricos pra prova ou para usar
  collection??
Collections
• Tem mais coisas que preciso saber sobre
  Genéricos pra prova ou para usar
  collection??
  – SIM! Tem, é só mais uma coisa, que eu vou
    explicar depois!
Collections
• Tem mais coisas que preciso saber sobre
  Genéricos pra prova ou para usar
  collection??
  – SIM! Tem, é só mais uma coisa, que eu vou
    explicar depois!
• Mas vamos voltar para collections se não
  agente não acaba!
LEMBRA ???

Utilitários
Collections
• A java.util.Collection:
  – Collection é um contrato de interface que
    representa uma coleção de objetos
  – Pode-se dizer que uma coleção é uma versão
    turbinada de array, com mais funcionalidades
    e mais segurança.
Collections
• Métodos java.util.Collection<E> extends Iterable<E>:
   boolean add(E e)
   boolean addAll(Collection<? extends E> c)
   boolean remove(Object o)
   boolean removeAll(Collection<?> c)
   boolean retainAll(Collection<?> c)
   void clear()
   boolean contains(Object o)
   boolean containsAll(Collection<?> c)
   int size()
   boolean isEmpty()
   Object[] toArray()
   <T> T[] toArray(T[] a)
   Iterator<E> iterator() //método de Iterable
Collections
• java.util.Collection<E> extends Iterable<E>:
   boolean add(E e)
   boolean addAll(Collection<? extends E> c)
   boolean remove(Object o)
   boolean removeAll(Collection<?> c)
   boolean retainAll(Collection<?> c)
   void clear()                         Opcional

   boolean contains(Object o)
   boolean containsAll(Collection<?> c)
   int size()
   boolean isEmpty()
   Object[] toArray()
   <T> T[] toArray(T[] a)
   Iterator<E> iterator()
Collections
• java.util.Collection<E> extends Iterable<E>:
   boolean add(E e)
   boolean addAll(Collection<? extends E> c)       COMO ASSIM OPCIONAL?
   boolean remove(Object o)
   boolean removeAll(Collection<?> c)
   boolean retainAll(Collection<?> c)
   void clear()                         Opcional

   boolean contains(Object o)
   boolean containsAll(Collection<?> c)
   int size()
   boolean isEmpty()
   Object[] toArray()
   <T> T[] toArray(T[] a)
   Iterator<E> iterator()
Collections
• java.util.Collection<E> extends Iterable<E>:
   boolean add(E e)
   boolean addAll(Collection<? extends E> c)       COMO ASSIM OPCIONAL?
   boolean remove(Object o)
   boolean removeAll(Collection<?> c)              A interface pede o método,
                                                   como vocês podem ver,
   boolean retainAll(Collection<?> c)              porém na implementação
   void clear()                         Opcional   pode-se lançar a exceção
                                                   UnsupportedOperationException
   boolean contains(Object o)                      E isso é utilizado em
   boolean containsAll(Collection<?> c)            Implementações somente leitura
                                                   Implementações boca de lobo
   int size()                                      ou outros tipos.
   boolean isEmpty()
   Object[] toArray()
   <T> T[] toArray(T[] a)
   Iterator<E> iterator()
Collections
• java.util.Collection<E> extends Iterable<E>:
   boolean add(E e)
   boolean addAll(Collection<? extends E> c)
   boolean remove(Object o)
   boolean removeAll(Collection<?> c)
   boolean retainAll(Collection<?> c)
   void clear()
   boolean contains(Object o)
   boolean containsAll(Collection<?> c)
   int size()                           Vamos conhecer os métodos!
   boolean isEmpty()
   Object[] toArray()
   <T> T[] toArray(T[] a)
   Iterator<E> iterator()
Collections
• java.util.Collection<E> extends Iterable<E>:
   boolean add(E e)
   boolean addAll(Collection<? extends E> c)
   boolean remove(Object o)
   boolean removeAll(Collection<?> c)      Adiciona um elemento a
   boolean retainAll(Collection<?> c)    coleção, onde este elemento
   void clear()                          deve ser do mesmo tipo <E>
   boolean contains(Object o)           da coleção, ou de um sub-tipo.
   boolean containsAll(Collection<?> c) Retorna verdadeiro se houver
   int size()                             modificação na coleção, ou
   boolean isEmpty()                         seja se o elemento for
                                                  adicionado.
   Object[] toArray()
   <T> T[] toArray(T[] a)
                                          Implementação é opcional
   Iterator<E> iterator()
Collections
• java.util.Collection<E> extends Iterable<E>:
   boolean add(E e)
   boolean addAll(Collection<? extends E> c)
   boolean remove(Object o)
   boolean removeAll(Collection<?> c)      Adiciona uma coleção de
   boolean retainAll(Collection<?> c)   elementos do mesmo tipo <E>
   void clear()                          ou uma coleção de sub-tipos
   boolean contains(Object o)                      de <E>.
   boolean containsAll(Collection<?> c)   Retorna verdadeiro se pelo
   int size()                               menos um elemento for
   boolean isEmpty()                    adicionado a coleção, ou seja,
                                         se a coleção foi modificada.
   Object[] toArray()
   <T> T[] toArray(T[] a)
                                          Implementação é opcional
   Iterator<E> iterator()
Collections
• java.util.Collection<E> extends Iterable<E>:
   boolean add(E e)
   boolean addAll(Collection<? extends E> c)
   boolean remove(Object o)
   boolean removeAll(Collection<?> c) Remove da coleção a primeira
   boolean retainAll(Collection<?> c)       ocorrência de um objeto
   void clear()                            significantemente igual ao
   boolean contains(Object o)                        enviado.
   boolean containsAll(Collection<?> c)   Retorna verdadeiro caso o
   int size()                            objeto existia na coleção, ou
   boolean isEmpty()                          seja, se a coleção foi
                                                   modificada.
   Object[] toArray()
   <T> T[] toArray(T[] a)
                                          Implementação é opcional.
   Iterator<E> iterator()
Collections
• java.util.Collection<E> extends Iterable<E>:
   boolean add(E e)
   boolean addAll(Collection<? extends E> c)
   boolean remove(Object o)
   boolean removeAll(Collection<?> c)         Remove todas da as
   boolean retainAll(Collection<?> c)   ocorrências desta coleção dos
   void clear()                         elementos contidos na coleção
   boolean contains(Object o)                      c enviada.
   boolean containsAll(Collection<?> c) Após esta operação nenhum
   int size()                               elemento desta coleção
   boolean isEmpty()                    retornará true para c.contains()
                                          Retorna verdadeiro se pelo
   Object[] toArray()
                                            menos um elemento foi
   <T> T[] toArray(T[] a)
                                            removido, ou seja, se a
   Iterator<E> iterator()
                                            coleção foi modificada.
                                          Implementação é opcional.
Collections
• java.util.Collection<E> extends Iterable<E>:
   boolean add(E e)
   boolean addAll(Collection<? extends E> c)
   boolean remove(Object o)
   boolean removeAll(Collection<?> c)     Faz o processo inverso de
   boolean retainAll(Collection<?> c)              removeAll.
   void clear()                          Retém nesta coleção apénas
   boolean contains(Object o)             os elementos que também
   boolean containsAll(Collection<?> c) estejam continos na coleção c.
   int size()                            Após esta operação todos os
   boolean isEmpty()                       elementos desta coleção
                                              retornarão true para
   Object[] toArray()
                                                  c.contains().
   <T> T[] toArray(T[] a)
                                           Retorna verdadeiro se a
   Iterator<E> iterator()
                                            coleção for modificada.
                                          Implementação é opcional
Collections
• java.util.Collection<E> extends Iterable<E>:
   boolean add(E e)
   boolean addAll(Collection<? extends E> c)
   boolean remove(Object o)
   boolean removeAll(Collection<?> c)    Remove todos os elementos
   boolean retainAll(Collection<?> c)            da coleção
   void clear()
   boolean contains(Object o)             Implementação é opcional.
   boolean containsAll(Collection<?> c)
   int size()
   boolean isEmpty()
   Object[] toArray()
   <T> T[] toArray(T[] a)
   Iterator<E> iterator()
Collections
• java.util.Collection<E> extends Iterable<E>:
   boolean add(E e)
   boolean addAll(Collection<? extends E> c)
   boolean remove(Object o)
   boolean removeAll(Collection<?> c) Verifica se existe nesta coleção
   boolean retainAll(Collection<?> c)    um objeto significantemente
   void clear()                           igual ao objeto o enviado.
   boolean contains(Object o)
   boolean containsAll(Collection<?> c)
   int size()
   boolean isEmpty()
   Object[] toArray()
   <T> T[] toArray(T[] a)
   Iterator<E> iterator()
Collections
• java.util.Collection<E> extends Iterable<E>:
   boolean add(E e)
   boolean addAll(Collection<? extends E> c)
   boolean remove(Object o)
   boolean removeAll(Collection<?> c) Verifica se todos os objetos da
   boolean retainAll(Collection<?> c)       coleção c enviada, estão
   void clear()                              contidos nesta coleção.
   boolean contains(Object o)                 Só retorna verdade se
   boolean containsAll(Collection<?> c) this.contains(elementoDeC) for
   int size()                            verdade para cada elemento
   boolean isEmpty()                                   de c.
   Object[] toArray()
   <T> T[] toArray(T[] a)
   Iterator<E> iterator()
Collections
• java.util.Collection<E> extends Iterable<E>:
   boolean add(E e)
   boolean addAll(Collection<? extends E> c)
   boolean remove(Object o)
   boolean removeAll(Collection<?> c)      Informa a quantidade de
   boolean retainAll(Collection<?> c)    objetos contidos na coleção.
   void clear()                          Obs.: Se a coleção contiver
   boolean contains(Object o)             objetos nulos eles também
   boolean containsAll(Collection<?> c)      serão contabilizados
   int size()
   boolean isEmpty()                      Sim! Existem coleções que
                                          aceitam elementos nulos.
   Object[] toArray()
   <T> T[] toArray(T[] a)
   Iterator<E> iterator()
Collections
• java.util.Collection<E> extends Iterable<E>:
   boolean add(E e)
   boolean addAll(Collection<? extends E> c)
   boolean remove(Object o)
   boolean removeAll(Collection<?> c)     Método de comodidade, o
   boolean retainAll(Collection<?> c)        mesmo que testar se:
   void clear()                                  size() == 0
   boolean contains(Object o)             Retorna verdadeiro se não
   boolean containsAll(Collection<?> c)    houver elementos nesta
   int size()                                     coleção.
   boolean isEmpty()
   Object[] toArray()
   <T> T[] toArray(T[] a)
   Iterator<E> iterator()
Collections
• java.util.Collection<E> extends Iterable<E>:
   boolean add(E e)
   boolean addAll(Collection<? extends E> c)
   boolean remove(Object o)
   boolean removeAll(Collection<?> c)    Retorna uma array contendo
   boolean retainAll(Collection<?> c)   cada um dos elementos desta
   void clear()                         coleção, na mesma ordem em
   boolean contains(Object o)            que os elementos aparecem
   boolean containsAll(Collection<?> c)           no iterator().
   int size()                             Não é a array mantida pela
   boolean isEmpty()                         lista (caso assim seja
                                         implementada) é uma cópia
   Object[] toArray()
                                                      dela.
   <T> T[] toArray(T[] a)
                                        Alterações nesta array não são
   Iterator<E> iterator()
                                             refletidas na coleção.
Collections
• java.util.Collection<E> extends Iterable<E>:
   boolean add(E e)
   boolean addAll(Collection<? extends E> c)
   boolean remove(Object o)
   boolean removeAll(Collection<?> c) Retorna todos os elementos da
   boolean retainAll(Collection<?> c)       coleção em uma array do
   void clear()                              mesmo tipo da enviada.
   boolean contains(Object o)           if (a.length >= this.size()) {
   boolean containsAll(Collection<?> c) Então os elementos serão
   int size()                           colocados dentro da própria
   boolean isEmpty()                    array enviada e os elementos
                                        que sobrarem serão setados
   Object[] toArray()
                                        null.
   <T> T[] toArray(T[] a)
                                        } else {
   Iterator<E> iterator()
                                        cria uma nova array do mesmo
                                        tipo da enviada e a retorna.
Collections
• java.util.Collection<E> extends Iterable<E>:
   boolean add(E e)
   boolean addAll(Collection<? extends E> c)
   boolean remove(Object o)
   boolean removeAll(Collection<?> c)     Cria um Iterator que é usado
   boolean retainAll(Collection<?> c)        para navegar sobre os
   void clear()                             elementos desta coleção
   boolean contains(Object o)           public interface Iterator<E> {
   boolean containsAll(Collection<?> c)   boolean hasNext();
   int size()                             E next();
   boolean isEmpty()                      void remove(); //opicional
                                        }
   Object[] toArray()
                                        * Este método é parte da
   <T> T[] toArray(T[] a)
                                        interface Iterable<E> e toda
   Iterator<E> iterator() //*
                                        classe que a implementa pode
                                        ser usada em um for-each
Collections
• java.util.Collection<E>:
  – Não há restrição, ordem ou classificação
    definida no contrato de Collection
Collections
• java.util.Collection<E>:
  – Não há restrição, ordem ou classificação
    definida no contrato de Collection
  – A coleção de objetos pode conter qualquer
    tipo de objeto, em qualquer quantidade,
    sejam eles repetidos ou não, sem qualquer
    ordem ou classificação definida.
Collections
• java.util.Collection<E>:
  – Não há restrição, ordem ou classificação
    definida no contrato de Collection
  – A coleção de objetos pode conter qualquer
    tipo de objeto, em qualquer quantidade,
    sejam eles repetidos ou não, sem qualquer
    ordem ou classificação definida.
  – Esta é a forma mais genérica de agrupar
    objetos
Collections
• Tá! e se eu quiser uma coleção sem
  deixar que os objetos se repitam ??
Collections
• Tá! e se eu quiser uma coleção sem
  deixar que os objetos se repitam ??
  – Então você quer um java.util.Set uma sub-
    interface de Collection
Collections
• java.util.Set<E> extends Collection<E>:
  – Um Set tem exatamente a mesma interface de
    Collection, a única mudança é na descrição de seus
    métodos.
  – O Set não aceita elementos repetidos
  – Ao usar add(obj) onde o Set já contem obj, ele
    simplesmente não o adiciona e retorna false.
  – A não implementação de equals(Object o) ou a
    implementação incorreta pode causar efeitos
    indesejáveis e bug de difícil detectação.
Collections
• java.util.Set<E> extends Collection<E>:
  – Um Set tem exatamente a mesma interface de
    Collection, a única mudança é na descrição de seus
    métodos.
  – O Set não aceita elementos repetidos
  – Ao usar add(obj) onde o Set já contem obj, ele
    simplesmente não o adiciona e retorna false.
  – A não implementação de equals(Object o) ou a
    implementação incorreta pode causar efeitos
    indesejáveis e bug de difícil detectação.
Collections
• java.util.Set<E> extends Collection<E>:
  – Um Set tem exatamente a mesma interface de
    Collection, a única mudança é na descrição de seus
    métodos.
  – O Set não aceita elementos repetidos
  – Ao usar add(obj) onde o Set já contem obj, ele
    simplesmente não o adiciona e retorna false.
  – A não implementação de equals(Object o) ou a
    implementação incorreta pode causar efeitos
    indesejáveis e bug de difícil detectação.
Collections
• java.util.Set<E> extends Collection<E>:
  – Assim como a Collection, não há restrição, ordem ou
    classificação definida no contrato de Set
  – A coleção de objetos pode conter qualquer tipo de
    objeto, em qualquer quantidade, sem qualquer ordem
    ou classificação definida, porem nunca objetos
    repetidos!
  – Este é o diferencial de um Set para uma Collection,
    não há objetos significantemente repetidos, isso
    quer dizer onde equals(other) retorne true para outro
    elemento dentro do mesmo Set.
Collections
• java.util.Set<E> extends Collection<E>:
  – Assim como a Collection, não há restrição, ordem ou
    classificação definida no contrato de Set
  – A coleção de objetos pode conter qualquer tipo de
    objeto, em qualquer quantidade, sem qualquer ordem
    ou classificação definida, porem nunca objetos
    repetidos!
  – Este é o diferencial de um Set para uma Collection,
    não há objetos significantemente repetidos, isso
    quer dizer onde equals(other) retorne true para outro
    elemento dentro do mesmo Set.
Collections
• java.util.Set<E> extends Collection<E>:
  – Assim como a Collection, não há restrição, ordem ou
    classificação definida no contrato de Set
  – A coleção de objetos pode conter qualquer tipo de
    objeto, em qualquer quantidade, sem qualquer ordem
    ou classificação definida, porem nunca objetos
    repetidos!
  – Este é o diferencial de um Set para uma Collection,
    não há objetos significantemente repetidos, isso
    quer dizer onde equals(other) retorne true para outro
    elemento dentro do mesmo Set.
Collections
• É possível também utilizar os conceitos de
  fila com a Java Collections Framework
  – Através da interface java.util.Queue<E>
Collections
• java.util.Queue<E> extends Collection<E>:
  – Assim como a Collection, não há restrição, ordem ou
    classificação definida no contrato da fila Queue
  – Há apenas disponibilizado uma interface de fila,
    sem especificar quais condições.
  – As suas implementações que vão definir se a Queue
    é uma FIFO, FILO ou o quer que seja.
Collections
• java.util.Queue<E> extends Collection<E>:
  – Assim como a Collection, não há restrição, ordem ou
    classificação definida no contrato da fila Queue
  – Há apenas disponibilizado uma interface de fila,
    sem especificar quais condições.
  – As suas implementações que vão definir se a Queue
    é uma FIFO, FILO ou o quer que seja.
Collections
• java.util.Queue<E> extends Collection<E>:
  – Assim como a Collection, não há restrição, ordem ou
    classificação definida no contrato da fila Queue
  – Há apenas disponibilizado uma interface de fila,
    sem especificar quais condições.
  – As suas implementações que vão definir se a Queue
    é uma FIFO, FILO ou o quer que seja.
Collections
• java.util.Queue<E> extends Collection<E>:
  boolean add(E e) //adciona um elemento a fila se houver capacidade,
                     //lança uma IllegalStateException se não houver.
  boolean offer(E e) //adciona um elemento a fila se houver capacidade,
                     //retorna false (sem lança exceção) se não houver.

  E element() //retorna, mas não remove o elemento do topo da fila
              //lança uma exceção se não houver mais elementos
  E peek()    //retorna, mas não remove o elemento do topo da fila
              //retorna null se não houver elementos.

  E remove() //retorna e remove o elemento do topo da fila
              //lança uma exceção se não houver mais elementos.
  E poll()   //retorna e remove o elemento do topo da fila
              //retorna null se não houver elementos.
Collections
• java.util.Queue<E> extends Collection<E>:
  boolean add(E e) //adiciona um elemento a fila se houver capacidade,
                     // se não houver lança uma IllegalStateException.
  boolean offer(E e) //adiciona um elemento a fila se houver capacidade,
                     // se não houver retorna false (sem lança exceção).

  E element() //retorna, mas não remove o elemento do topo da fila
              //lança uma exceção se não houver mais elementos.
  E peek()    //retorna, mas não remove o elemento do topo da fila
              //retorna null se não houver elementos.

  E remove() //retorna e remove o elemento do topo da fila
              //lança uma exceção se não houver mais elementos.
  E poll()   //retorna e remove o elemento do topo da fila
              //retorna null se não houver elementos.
Collections
• java.util.Queue<E> extends Collection<E>:
  boolean add(E e) //adiciona um elemento a fila se houver capacidade,
                     // se não houver lança uma IllegalStateException.
  boolean offer(E e) //adiciona um elemento a fila se houver capacidade,
                     // se não houver retorna false (sem lança exceção).

  E element() //retorna, mas não remove o elemento do topo da fila
              //não havendo + elementos lança NoSuchElementException.
  E peek()    //retorna, mas não remove o elemento do topo da fila
              //retorna null se não houver elementos.

  E remove() //retorna e remove o elemento do topo da fila
              //lança uma exceção se não houver mais elementos.
  E poll()   //retorna e remove o elemento do topo da fila
              //retorna null se não houver elementos.
Collections
• java.util.Queue<E> extends Collection<E>:
  boolean add(E e) //adiciona um elemento a fila se houver capacidade,
                     // se não houver lança uma IllegalStateException.
  boolean offer(E e) //adiciona um elemento a fila se houver capacidade,
                     // se não houver retorna false (sem lança exceção).

  E element() //retorna, mas não remove o elemento do topo da fila
              //não havendo + elementos lança NoSuchElementException.
  E peek()    //retorna, mas não remove o elemento do topo da fila
              //retorna null se não houver elementos.

  E remove() //retorna e remove o elemento do topo da fila
             //não havendo + elementos lança NoSuchElementException.
  E poll()   //retorna e remove o elemento do topo da fila
             //retorna null se não houver elementos.
Collections
• Mas e como eu consigo verificar o elemento 4
  que esta dentro de uma Collection, Queue ou
  Set? só da usando o iterator() ?
  – Sim infelizmente sim, a única forma de verificar os
    elementos destas duas interfaces é percorrendo a
    coleção toda!
• Putz! E aquele papo de que era uma array
  turbinada?? Não tem índice ?
  – Para tudo na vida tem uma solução, o que você quer
    é uma java.util.List
Collections
• Mas e como eu consigo verificar o elemento 4
  que esta dentro de uma Collection, Queue ou
  Set? só da usando o iterator() ?
  – Sim infelizmente sim, a única forma de verificar os
    elementos destas interfaces é percorrendo a coleção
    toda!
• Putz! E aquele papo de que era uma array
  turbinada?? Não tem índice ?
  – Para tudo na vida tem uma solução, o que você quer
    é uma java.util.List
Collections
• Mas e como eu consigo verificar o elemento 4
  que esta dentro de uma Collection, Queue ou
  Set? só da usando o iterator() ?
  – Sim infelizmente sim, a única forma de verificar os
    elementos destas interfaces é percorrendo a coleção
    toda!
• Putz! E aquele papo de que era uma array
  turbinada?? Não tem índice ? cadê o get(3) ?
  – Para tudo na vida tem uma solução, o que você quer
    é uma java.util.List
Collections
• Mas e como eu consigo verificar o elemento 4
  que esta dentro de uma Collection, Queue ou
  Set? só da usando o iterator() ?
  – Sim infelizmente sim, a única forma de verificar os
    elementos destas interfaces é percorrendo a coleção
    toda!
• Putz! E aquele papo de que era uma array
  turbinada?? Não tem índice ? cadê o get(3) ?
  – Para tudo na vida tem uma solução, o que você quer
    é uma java.util.List<E>
Collections
• java.util.List<E> extends Collection<E>:
  – Uma List é uma coleção ordenada (não classificada), muito
    parecida com arrays, porem com bem mais funcionalidades e
    sem limite de tamanho.
  – Os métodos add() e addAll() da interface Collection adicionam
    itens ao final da List.
  – Assim como as Collection todos os métodos de adição e
    remoção são opcionais e podem lançar
    UnsupportedOperationException
  – As mudanças principais em relação a Collection é que tem seus
    itens ordenado. Os itens da List são ordenados em índice
      que vão de 0 a (size() -1), conformes veremos a seguir, e usar
    índice fora desse range gera IndexOutOfBoundsException.
Collections
• java.util.List<E> extends Collection<E>:
  – Uma List é uma coleção ordenada (não classificada), muito
    parecida com arrays, porem com bem mais funcionalidades e
    sem limite de tamanho.
  – Os métodos add() e addAll() da interface Collection adicionam
    itens ao final da List.
  – Assim como as Collection todos os métodos de adição e
    remoção são opcionais e podem lançar
    UnsupportedOperationException
  – As mudanças principais em relação a Collection é que tem seus
    itens ordenado. Os itens da List são ordenados em índice
      que vão de 0 a (size() -1), conformes veremos a seguir, e usar
    índice fora desse range gera IndexOutOfBoundsException.
Collections
• java.util.List<E> extends Collection<E>:
  – Uma List é uma coleção ordenada (não classificada), muito
    parecida com arrays, porem com bem mais funcionalidades e
    sem limite de tamanho.
  – Os métodos add() e addAll() da interface Collection adicionam
    itens ao final da List.
  – Assim como as Collection todos os métodos de adição e
    remoção são opcionais e podem lançar
    UnsupportedOperationException
  – As mudanças principais em relação a Collection é que tem seus
    itens ordenado. Os itens da List são ordenados em índice
      que vão de 0 a (size() -1), conformes veremos a seguir, e usar
    índice fora desse range gera IndexOutOfBoundsException.
Collections
• java.util.List<E> extends Collection<E>:
  – Uma List é uma coleção ordenada (não classificada), muito
    parecida com arrays, porem com bem mais funcionalidades e
    sem limite de tamanho.
  – Os métodos add() e addAll() da interface Collection adicionam
    itens ao final da List.
  – Assim como as Collection todos os métodos de adição e
    remoção são opcionais e podem lançar
    UnsupportedOperationException
  – As mudanças principais em relação a Collection é que tem seus
    itens ordenado. Os itens da List são ordenados em índice
      que vão de 0 a (size() -1), conformes veremos a seguir, e usar
    índice fora desse range gera IndexOutOfBoundsException.
Collections
• java.util.List<E> extends Collection<E>:
  – Uma List é uma coleção ordenada (não classificada), muito
    parecida com arrays, porem com bem mais funcionalidades e
    sem limite de tamanho.
  – Os métodos add() e addAll() da interface Collection adicionam
    itens ao final da List.
  – Assim como as Collection todos os métodos de adição e
    remoção são opcionais e podem lançar
    UnsupportedOperationException
  – As mudanças principais em relação a Collection é que tem seus
    itens ordenado. Os itens da List são ordenados em índice que
    vão de 0 a (size() -1), conformes veremos a seguir, e usar índice
    fora desse range gera IndexOutOfBoundsException.
Collections
• java.util.List<E> extends Collection<E>:
  boolean add(int i, E e)
  boolean addAll(int i, Collection<? extends E> c)
  E get(int i)
  int indexOf(Object o)
  int lastIndexOf(Object o)
  ListIterator<E> listIterator()
  ListIterator<E> listIterator(int i)
  E remove(int i)
  E set(int index, E element)
  List<E> subList(int fromIndex, int toIndex)
Collections
• java.util.List<E> extends Collection<E>:
  boolean add(int i, E e)
  boolean addAll(int i, Collection<? extends E> c)
  E get(int i)
  int indexOf(Object o)               Adiciona o elemento e na posição
                                      de índice i. Se houver, o antigo
  int lastIndexOf(Object o)
                                      elemento do índice e seus
  ListIterator<E> listIterator()      posteriores terão seus índices
  ListIterator<E> listIterator(int i) incrementados
  E remove(int i)
  E set(int index, E element)
  List<E> subList(int fromIndex, int toIndex)
Collections
• java.util.List<E> extends Collection<E>:
  boolean add(int i, E e)
  boolean addAll(int i, Collection<? extends E> c)
  E get(int i)
  int indexOf(Object o)               Adiciona os elemento de c na
                                      posição de índice i. Se houver, o
  int lastIndexOf(Object o)
                                      antigo elemento do índice e seus
  ListIterator<E> listIterator()      posteriores terão seus índices
  ListIterator<E> listIterator(int i) incrementados em c.size()
  E remove(int i)
  E set(int index, E element)
  List<E> subList(int fromIndex, int toIndex)
Collections
• java.util.List<E> extends Collection<E>:
  boolean add(int i, E e)
  boolean addAll(int i, Collection<? extends E> c)
  E get(int i)
  int indexOf(Object o)               Retorna o elemento do índice i
  int lastIndexOf(Object o)
  ListIterator<E> listIterator()
  ListIterator<E> listIterator(int i)
  E remove(int i)
  E set(int index, E element)
  List<E> subList(int fromIndex, int toIndex)
Collections
• java.util.List<E> extends Collection<E>:
  boolean add(int i, E e)
  boolean addAll(int i, Collection<? extends E> c)
  E get(int i)
  int indexOf(Object o)               Retorna o índice do primeiro
                                      objeto da list igual ao enviado ou
  int lastIndexOf(Object o)
                                      -1 caso não exista o objeto na
  ListIterator<E> listIterator()      coleção.
  ListIterator<E> listIterator(int i)
  E remove(int i)
  E set(int index, E element)
  List<E> subList(int fromIndex, int toIndex)
Collections
• java.util.List<E> extends Collection<E>:
  boolean add(int i, E e)
  boolean addAll(int i, Collection<? extends E> c)
  E get(int i)
  int indexOf(Object o)               Retorna o índice do ultimo objeto
                                      da list igual ao enviado ou -1 caso
  int lastIndexOf(Object o)
                                      não exista o objeto na coleção.
  ListIterator<E> listIterator()
  ListIterator<E> listIterator(int i)
  E remove(int i)
  E set(int index, E element)
  List<E> subList(int fromIndex, int toIndex)
Collections
• java.util.List<E> extends Collection<E>:
  boolean add(int i, E e)
  boolean addAll(int i, Collection<? extends E> c)
  E get(int i)
  int indexOf(Object o)               Retorna um ListIterator desta List.
                                      Este objeto é uma extensão do
  int lastIndexOf(Object o)
                                      Iterator, com a diferença que
  ListIterator<E> listIterator()      você pode caminhar p/ frente ou
  ListIterator<E> listIterator(int i) p/ traz na lista, alem de adicionar
  E remove(int i)                     e alterar elementos no índice
                                      corrente.
  E set(int index, E element)
  List<E> subList(int fromIndex, int toIndex)
Collections
• java.util.List<E> extends Collection<E>:
  public interface ListIterator<E>
     extends Iterator<E> {

      boolean hasNext()              Retorna um ListIterator desta List.
      E next()                       Este objeto é uma extensão do
      int nextIndex()                Iterator, com a diferença que
      boolean hasPrevious()          você pode caminhar p/ frente ou
      E previous()                   p/ traz na lista, alem de adicionar
      int previousIndex()            e alterar elementos no índice
      void add(E e)                  corrente.
      void set(E e)
      void remove()

  }
Collections
• java.util.List<E> extends Collection<E>:
  public interface ListIterator<E>
     extends Iterator<E> {

      boolean hasNext()              Verifica se há um próximo
      E next()                       elemento na List.
      int nextIndex()
      boolean hasPrevious()
      E previous()
      int previousIndex()
      void add(E e)
      void set(E e)
      void remove()

  }
Collections
• java.util.List<E> extends Collection<E>:
  public interface ListIterator<E>
     extends Iterator<E> {

      boolean hasNext()              Retorna o próximo elemento da
      E next()                       List.
      int nextIndex()
      boolean hasPrevious()          Se não houver o próximo
      E previous()                   elemento uma
      int previousIndex()            NoSuchElementException é
      void add(E e)                  lançada.
      void set(E e)
      void remove()

  }
Collections
• java.util.List<E> extends Collection<E>:
  public interface ListIterator<E>
     extends Iterator<E> {

      boolean hasNext()              Retorna o índice do próximo
      E next()                       elemento da List.
      int nextIndex()
      boolean hasPrevious()          Se não houver um próximo
      E previous()                   elemento retorna o tamanha da
      int previousIndex()            lista, ou seja, o mesmo que
      void add(E e)                  lista.size().
      void set(E e)
      void remove()

  }
Collections
• java.util.List<E> extends Collection<E>:
  public interface ListIterator<E>
     extends Iterator<E> {

      boolean hasNext()              Verifica se há um elemento
      E next()                       anterior na List.
      int nextIndex()
      boolean hasPrevious()
      E previous()
      int previousIndex()
      void add(E e)
      void set(E e)
      void remove()

  }
Collections
• java.util.List<E> extends Collection<E>:
  public interface ListIterator<E>
     extends Iterator<E> {

      boolean hasNext()              Retorna o elemento anterior da
      E next()                       List.
      int nextIndex()
      boolean hasPrevious()          Se não houver o elemento
      E previous()                   anterior uma
      int previousIndex()            NoSuchElementException é
      void add(E e)                  lançada.
      void set(E e)
      void remove()

  }
Collections
• java.util.List<E> extends Collection<E>:
  public interface ListIterator<E>
     extends Iterator<E> {

      boolean hasNext()              Retorna o índice do elemento
      E next()                       anterior da List.
      int nextIndex()
      boolean hasPrevious()          Se não houver um elemento
      E previous()                   anterior retorna -1.
      int previousIndex()
      void add(E e)
      void set(E e)
      void remove()

  }
Collections
• java.util.List<E> extends Collection<E>:
  public interface ListIterator<E>
     extends Iterator<E> {

      boolean hasNext()              Adiciona o elemento e a List no
      E next()                       índice atual, entre nextIndex() e
      int nextIndex()                previousIndex().
      boolean hasPrevious()
      E previous()
      int previousIndex()
      void add(E e)
      void set(E e)
      void remove()

  }
Collections
• java.util.List<E> extends Collection<E>:
  public interface ListIterator<E>
     extends Iterator<E> {

      boolean hasNext()              Substitui o último elemento
      E next()                       retornado por next ou previous.
      int nextIndex()
      boolean hasPrevious()          Se anteriormente next / previous
      E previous()                   não foi chamado ou add / remove
      int previousIndex()            foi invocado será lançada uma
      void add(E e)                  IllegalStateException
      void set(E e)
      void remove()

  }
Collections
• java.util.List<E> extends Collection<E>:
  public interface ListIterator<E>
     extends Iterator<E> {

      boolean hasNext()              Remove o último elemento
      E next()                       retornado por next ou previous.
      int nextIndex()
      boolean hasPrevious()          Se anteriormente next / previous
      E previous()                   não foi chamado ou add / remove
      int previousIndex()            foi invocado será lançada uma
      void add(E e)                  IllegalStateException
      void set(E e)
      void remove()

  }
Collections
• java.util.List<E> extends Collection<E>:
  boolean add(int i, E e)
  boolean addAll(int i, Collection<? extends E> c)
  E get(int i)
  int indexOf(Object o)               Igual ao método anterior com a
                                      diferença que o índice corrente
  int lastIndexOf(Object o)
                                      do ListIterator será o índice
  ListIterator<E> listIterator()      passado.
  ListIterator<E> listIterator(int i) Obs.: é possível retornar para
  E remove(int i)                     antes do índice passado.
  E set(int index, E element)
  List<E> subList(int fromIndex, int toIndex)
Collections
• java.util.List<E> extends Collection<E>:
  boolean add(int i, E e)
  boolean addAll(int i, Collection<? extends E> c)
  E get(int i)
  int indexOf(Object o)               Remove o elemento de índice i da
                                      List e o retorna. Importante!!!
  int lastIndexOf(Object o)           Integer indexA = 1; int indexB = 1;
  ListIterator<E> listIterator()      list.remove(indexA)
                                      list.remove(indexB)
  ListIterator<E> listIterator(int i) são operações totalmente diferentes
  E remove(int i)                     O 1° remove um objeto Integer == 1
                                      O 2° remove o objeto no índice 1
  E set(int index, E element)
  List<E> subList(int fromIndex, int toIndex)
Collections
• java.util.List<E> extends Collection<E>:
  boolean add(int i, E e)
  boolean addAll(int i, Collection<? extends E> c)
  E get(int i)
  int indexOf(Object o)               Substitui o objeto no índice index
                                      pelo element enviado e retorna o
  int lastIndexOf(Object o)
                                      objeto substituído.
  ListIterator<E> listIterator()
  ListIterator<E> listIterator(int i)
  E remove(int i)
  E set(int index, E element)
  List<E> subList(int fromIndex, int toIndex)
Collections
• java.util.List<E> extends Collection<E>:
  boolean add(int i, E e)
  boolean addAll(int i, Collection<? extends E> c)
  E get(int i)
  int indexOf(Object o)               Retorna o elemento do índice
                                      fromIndex (inclusive) até os
  int lastIndexOf(Object o)           elementos de índice toIndex
  ListIterator<E> listIterator()      (exclusive). Mudança na subList são
                                      refletidas na List original, o contrario
  ListIterator<E> listIterator(int i) impossibilita o uso da subList, que, se
  E remove(int i)                     usada, lançará
                                      ConcurrentModificationException
  E set(int index, E element)
  List<E> subList(int fromIndex, int toIndex)
Collections
• Ok, mas existe alguma forma de criar
  Coleções classificadas ?
  – Sim!!
• Mas antes de vermos como manter listas
  classificadas precisamos conhecer duas
  interfaces Comparator<T> e
  Comparable<T>
• Estas duas interfaces indicam a ordem de
  classificação dos objetos
Collections
• Ok, mas existe alguma forma de criar
  Coleções classificadas ?
  – Sim!!
• Mas antes de vermos como manter listas
  classificadas precisamos conhecer duas
  interfaces Comparator<T> e
  Comparable<T>
• Estas duas interfaces indicam a ordem de
  classificação dos objetos
Collections
• Ok, mas existe alguma forma de criar
  Coleções classificadas ?
  – Sim!!
• Mas antes de vermos como manter listas
  classificadas precisamos conhecer duas
  interfaces Comparator<T> e
  Comparable<T>
• Estas duas interfaces indicam a ordem de
  classificação dos objetos
Collections
• Ok, mas existe alguma forma de criar
  Coleções classificadas ?
  – Sim!!
• Mas antes de vermos como manter listas
  classificadas precisamos conhecer duas
  interfaces Comparator<T> e
  Comparable<T>
• Estas duas interfaces indicam a ordem de
  classificação dos objetos
Collections
• Comparable<T> é uma interface que só tem um método:
   int compareTo(T o)
   – Retorna negativo, zero, ou positivo quando este objeto é menor
      que, igual que ou maior que, respectivamente.
• Objetos que tem ordem natural implementam esta
  interface, por exemplo:
   String texto1 = “dado”, texto2 = “morta”;
   if (texto1.compareTo(texto2) < 0) {
       System.out.println(“texto1 vem 1°”);
   } else if (texto1.compareTo(texto2) > 0) {
        System.out.println(“texto1 vem 2°”);
   }
Collections
• Comparable<T> é uma interface que só tem um método:
   int compareTo(T o)
   – Retorna negativo, zero, ou positivo quando este objeto é menor
      que, igual que ou maior que, respectivamente.
• Objetos que tem ordem natural implementam esta
  interface... por exemplo:
   String texto1 = “dado”, texto2 = “morta”;
   if (texto1.compareTo(texto2) < 0) {
       System.out.println(“texto1 vem 1°”);
   } else if (texto1.compareTo(texto2) > 0) {
        System.out.println(“texto1 vem 2°”);
   }
Collections
• Comparable<T> é uma interface que só tem um método:
   int compareTo(T o)
   – Retorna negativo, zero, ou positivo quando este objeto é menor
      que, igual que ou maior que, respectivamente.
• Objetos que tem ordem natural implementam esta
  interface... por exemplo:
   String texto1 = “dado”, texto2 = “morta”;
   if (texto1.compareTo(texto2) < 0) {
       System.out.println(“texto1 vem 1°”);
   } else if (texto1.compareTo(texto2) > 0) {
        System.out.println(“texto1 vem 2°”);
   }
Collections
• Comparable<T> é uma interface que só tem um método:
   int compareTo(T o)
   – Retorna negativo, zero, ou positivo quando este objeto é menor
      que, igual que ou maior que, respectivamente.
• Objetos que tem ordem natural implementam esta
  interface... por exemplo:
   String texto1 = “dado”, texto2 = “morta”;
   if (texto1.compareTo(texto2) < 0) {
       System.out.println(“texto1 vem 1°”); //   imprime este
   } else if (texto1.compareTo(texto2) > 0) {
        System.out.println(“texto1 vem 2°”);
   }
Collections
• Alguma vezes precisamos comparar objetos
  que não tem ordem natural, ou então comparar
  objetos por propriedades diferentes da ordem
  natural
• Neste caso utilizamos Comparator<T>
  int compare(T o1, T o2)
• Um comparator funciona como um objeto
  ordenador, que recebe dois objetos, e compara
  o primeiro com o segundo (nesta ordem) de
  acordo com os critérios definidos no
  comparator.
Collections
• Alguma vezes precisamos comparar objetos
  que não tem ordem natural, ou então comparar
  objetos por propriedades diferentes da ordem
  natural
• Neste caso utilizamos Comparator<T>
  int compare(T o1, T o2)
• Um comparator funciona como um objeto
  ordenador, que recebe dois objetos, e compara
  o primeiro com o segundo (nesta ordem) de
  acordo com os critérios definidos no
  comparator.
Collections
• Alguma vezes precisamos comparar objetos
  que não tem ordem natural, ou então comparar
  objetos por propriedades diferentes da ordem
  natural
• Neste caso utilizamos Comparator<T>
  int compare(T o1, T o2)
• Um Comparator funciona como um objeto
  ordenador, que recebe dois objetos, e compara
  o primeiro com o segundo (nesta ordem) de
  acordo com os critérios definidos no
  Comparator.
Collections
•   Há! E antes de vermos como funcionam as listas ordenadas
    precisamos conhecer mais uma forma de usar os genéricos
    <? super E>
•   Enquanto que <? extends E> não permite o uso dos parâmetros
    tipados com E, o <? super E> permite o uso, e o parâmetro deve
    ser da classe E ou de uma Sub Classe de E, sim! De uma Sub
    classe.
    List<? super Number> numbers;
    numbers = new ArrayList<Number>(); //   ok compila!
    numbers = new ArrayList<Integer>(); //  NÃO compila!
    numbers = new ArrayList<Object>(); // ok compila!
    numbers.add(1); //numbers aceita qualquer sub classe de Number
    numbers.add(2.33); //ok também aceita
•   Como a List é da classe Number ou de uma Super classe de
    Number (no caso Object), é garantido que dentro de numbers vai
    caber qualquer classe Number ou sub-classe de Number na lista.
Collections
•   Há! E antes de vermos como funcionam as listas ordenadas
    precisamos conhecer mais uma forma de usar os genéricos
    <? super E>
•   Enquanto que <? extends E> não permite o uso dos parâmetros
    tipados com E, o <? super E> permite o uso, e o parâmetro deve
    ser da classe E ou de uma Sub Classe de E, sim! De uma Sub
    classe...
    List<? super Number> numbers;
    numbers = new ArrayList<Number>(); //   ok compila!
    numbers = new ArrayList<Integer>(); //  NÃO compila!
    numbers = new ArrayList<Object>(); // ok compila!
    numbers.add(1); //numbers aceita qualquer sub classe de Number
    numbers.add(2.33); //ok também aceita
•   Como a List é da classe Number ou de uma Super classe de
    Number (no caso Object), é garantido que dentro de numbers vai
    caber qualquer classe Number ou sub-classe de Number na lista.
Collections
•   Há! E antes de vermos como funcionam as listas ordenadas
    precisamos conhecer mais uma forma de usar os genéricos
    <? super E>
•   Enquanto que <? extends E> não permite o uso dos parâmetros
    tipados com E, o <? super E> permite o uso, e o parâmetro deve
    ser da classe E ou de uma Sub Classe de E, sim! De uma Sub
    classe... Por exemplo:
    List<? super Number> numbers;
    numbers = new ArrayList<Number>(); //   ok compila!
    numbers = new ArrayList<Integer>(); //  NÃO compila!
    numbers = new ArrayList<Object>(); // ok compila!
    numbers.add(1); //numbers aceita qualquer sub classe de Number
    numbers.add(2.33); //ok também aceita
•   Como a List é da classe Number ou de uma Super classe de
    Number (no caso Object), é garantido que dentro de numbers vai
    caber qualquer classe Number ou sub-classe de Number na lista.
Collections
•   Há! E antes de vermos como funcionam as listas ordenadas
    precisamos conhecer mais uma forma de usar os genéricos
    <? super E>
•   Enquanto que <? extends E> não permite o uso dos parâmetros
    tipados com E, o <? super E> permite o uso, e o parâmetro deve
    ser da classe E ou de uma Sub Classe de E, sim! De uma Sub
    classe... Por exemplo:
    List<? super Number> numbers;
    numbers = new ArrayList<Number>(); //   ok compila!
    numbers = new ArrayList<Integer>(); //  NÃO compila!
    numbers = new ArrayList<Object>(); // ok compila!
    numbers.add(1); //numbers aceita qualquer sub classe de Number
    numbers.add(2.33); //ok também aceita
•   Como a List é do tipo <Number> ou de uma Super classe de
    <Number> (no caso Object), é garantido que dentro da lista vai
    caber qualquer classe Number ou sub-classe de Number na lista.
Collections
• Agora vamos lá! Vamos conhecer como
  funciona as classes classificadas
  java.util.SortedSet<E> extends Set<E>
• Esta interface é de uma coleção classificada,
  onde a classificação do comparator usado por
  ela, ou a ordem natural é mantida sempre
• Não importa a ordem em que os elementos são
  adicionados a coleção, os itens dentro da
  coleção serão sempre mantidas na classificação
  definida por seu comparator ou pela ordem
  natural.
Collections
• Agora vamos lá! Vamos conhecer como
  funciona as classes classificadas
  java.util.SortedSet<E> extends Set<E>
• Esta interface é de uma coleção classificada,
  onde a classificação do Comparator usado por
  ela, ou a ordem natural é mantida sempre
• Não importa a ordem em que os elementos são
  adicionados a coleção, os itens dentro da
  coleção serão sempre mantidas na classificação
  definida por seu comparator ou pela ordem
  natural.
Collections
• Agora vamos lá! Vamos conhecer como
  funciona as classes classificadas
  java.util.SortedSet<E> extends Set<E>
• Esta interface é de uma coleção classificada,
  onde a classificação do Comparator usado por
  ela, ou a ordem natural é mantida sempre
• Não importa a ordem em que os elementos são
  adicionados a coleção, os itens dentro da
  coleção serão sempre mantidas na classificação
  definida por seu Comparator ou pela ordem
  natural.
Collections
• java.util.SortedSet<E> extends Set<E>:
  Comparator<? super E> comparator()
  E first()
  SortedSet<E> tailSet(E fromElement)
  E last()
  SortedSet<E> headSet(E toElement)
  SortedSet<E> subSet(E fromElement, E toElement)
Collections
• java.util.SortedSet<E> extends Set<E>:
  Comparator<? super E> comparator()
  E first()
  SortedSet<E> tailSet(E fromElement)
  E last()
  SortedSet<E> headSet(E toElement)
  SortedSet<E> subSet(E fromElement, E toElement)
   Se a ordem usada na List classificada for a natural retorna null, caso
   contrario retorna o Comparator que define a ordem usada na classificação.
   O Comparator é obrigatoriamente do mesmo tipo de E ou de um super tipo
   de E.

   Obs.: sendo o Comparator<? super E> seu método compare(E o1, E o2) vai
   aceitar objetos do tipo E ou de sub-classe, assim mantemos a integridade.
Collections
• java.util.SortedSet<E> extends Set<E>:
  Comparator<? super E> comparator()
  E first()
  SortedSet<E> tailSet(E fromElement)
  E last()
  SortedSet<E> headSet(E toElement)
  SortedSet<E> subSet(E fromElement, E toElement)
   Retorna o primeiro elemento, de acordo com a classificação desse
   SortedSet.
   Não importando a ordem em que os elementos são colocados na coleção,
   será retornado o primeiro elemento de acordo com a classificação da
   SortedSet.
Collections
• java.util.SortedSet<E> extends Set<E>:
  Comparator<? super E> comparator()
  E first()
  SortedSet<E> tailSet(E fromElement)
  E last()
  SortedSet<E> headSet(E toElement)
  SortedSet<E> subSet(E fromElement, E toElement)
   Define o tail – “rabo” – de uma sub SortedSet que inicia em fromElement
   (inclusive) incluindo todos os elementos maiores que fromElement
    - A sub coleção criada é um reflexo da coleção principal, e quaisquer
   operações em uma coleção será refletida na outra, e as duas coleções
   podem ser alteradas sem problemas.
    - A sub coleção não pode receber nenhum elemento menor que
   fromElement, gerando um IllegalArgumentException: key out of range
Collections
• java.util.SortedSet<E> extends Set<E>:
  Comparator<? super E> comparator()
  E first()
  SortedSet<E> tailSet(E fromElement)
  E last()
  SortedSet<E> headSet(E toElement)
  SortedSet<E> subSet(E fromElement, E toElement)
   Retorna o ultimo elemento, de acordo com a classificação desse SortedSet.
Collections
• java.util.SortedSet<E> extends Set<E>:
  Comparator<? super E> comparator()
  E first()
  SortedSet<E> tailSet(E fromElement)
  E last()
  SortedSet<E> headSet(E toElement)
  SortedSet<E> subSet(E fromElement, E toElement)
   Define a head – “cabeça” – de uma sub SortedSet que termina em
   toElement (exclusive) incluindo todos os elementos menores a toElement
    - A sub coleção criada é um reflexo da coleção principal, e quaisquer
   operações em uma coleção será refletida na outra, e as duas coleções
   podem ser alteradas sem problemas..
    - A sub coleção não pode receber nenhum elemento maior ou igual que
   toElement, gerando um IllegalArgumentException: key out of range
Collections
• java.util.SortedSet<E> extends Set<E>:
  Comparator<? super E> comparator()
  E first()
  SortedSet<E> tailSet(E fromElement)
  E last()
  SortedSet<E> headSet(E toElement)
  SortedSet<E> subSet(E fromElement, E toElement)
   Cria uma sub SortedSet com os elementos da coleção original iniciando em
   fromElement (inculsive) e terminando em toElement (exclusive).
    - A sub coleção criada é um reflexo da coleção principal, e quaisquer
   operações em uma coleção será refletida na outra, e as duas coleções
   podem ser alteradas sem problemas.
    - A nova coleção não pode receber nenhum elemento < fromElement
   ou >= toElement, gerando um IllegalArgumentException: key out of range
Collections
• Bem legal, mas e se eu quiser encontrar o primeiro
  objeto da coleção maior a element, ou um objeto menor
  a element? Entre outras informações mais detalhas?
Collections
• Bem legal, mas e se eu quiser encontrar o primeiro
  objeto da coleção maior a element, ou um objeto menor
  a element? Entre outras informações mais detalhas?
   – Nesse caso você precisa de uma
     java.util.NavigableSet<E> extends SortedSet<E>
Collections
• java.util.NavigableSet<E> extends SortedSet<E>:
   E lower(E e)
   E floor(E e)
   E higher(E e)
   E ceiling(E e)
   E pollFirst()
   E pollLast()
   Iterator<E> descendingIterator()
   NavigableSet<E> descendingSet()
   NavigableSet<E> headSet(E toElement, boolean inclusive)
   NavigableSet<E> tailSet(E fromElement, boolean inclusive)
   NavigableSet<E> subSet(E from, boolean inc, E to, boolean inc)
Collections
• java.util.NavigableSet<E> extends SortedSet<E>:
   E lower(E e)       //primeiro elemento menor a e
   E floor(E e)
   E higher(E e)
   E ceiling(E e)
   E pollFirst()
   E pollLast()
   Iterator<E> descendingIterator()
   NavigableSet<E> descendingSet()
   NavigableSet<E> headSet(E toElement, boolean inclusive)
   NavigableSet<E> tailSet(E fromElement, boolean inclusive)
   NavigableSet<E> subSet(E from, boolean inc, E to, boolean inc)
Collections
• java.util.NavigableSet<E> extends SortedSet<E>:
   E lower(E e)       //primeiro elemento menor a e
   E floor(E e)       //primeiro elemento menor ou igual a e
   E higher(E e)
   E ceiling(E e)
   E pollFirst()
   E pollLast()
   Iterator<E> descendingIterator()
   NavigableSet<E> descendingSet()
   NavigableSet<E> headSet(E toElement, boolean inclusive)
   NavigableSet<E> tailSet(E fromElement, boolean inclusive)
   NavigableSet<E> subSet(E from, boolean inc, E to, boolean inc)
Collections
• java.util.NavigableSet<E> extends SortedSet<E>:
   E lower(E e)       //primeiro elemento menor a e
   E floor(E e)       //primeiro elemento menor ou igual a e
   E higher(E e)      //primeiro elemento maior a e
   E ceiling(E e)
   E pollFirst()
   E pollLast()
   Iterator<E> descendingIterator()
   NavigableSet<E> descendingSet()
   NavigableSet<E> headSet(E toElement, boolean inclusive)
   NavigableSet<E> tailSet(E fromElement, boolean inclusive)
   NavigableSet<E> subSet(E from, boolean inc, E to, boolean inc)
Collections
• java.util.NavigableSet<E> extends SortedSet<E>:
   E lower(E e)       //primeiro elemento menor a e
   E floor(E e)       //primeiro elemento menor ou igual a e
   E higher(E e)      //primeiro elemento maior a e
   E ceiling(E e)     //primeiro elemento maior ou igual a e
   E pollFirst()
   E pollLast()
   Iterator<E> descendingIterator()
   NavigableSet<E> descendingSet()
   NavigableSet<E> headSet(E toElement, boolean inclusive)
   NavigableSet<E> tailSet(E fromElement, boolean inclusive)
   NavigableSet<E> subSet(E from, boolean inc, E to, boolean inc)
Collections
• java.util.NavigableSet<E> extends SortedSet<E>:
   E lower(E e)       //primeiro elemento menor a e
   E floor(E e)       //primeiro elemento menor ou igual a e
   E higher(E e)      //primeiro elemento maior a e
   E ceiling(E e)     //primeiro elemento maior ou igual a e
   E pollFirst()      //remove e retorna o primeiro elemento ou null
   E pollLast()
   Iterator<E> descendingIterator()
   NavigableSet<E> descendingSet()
   NavigableSet<E> headSet(E toElement, boolean inclusive)
   NavigableSet<E> tailSet(E fromElement, boolean inclusive)
   NavigableSet<E> subSet(E from, boolean inc, E to, boolean inc)
Collections
• java.util.NavigableSet<E> extends SortedSet<E>:
   E lower(E e)       //primeiro elemento menor a e
   E floor(E e)       //primeiro elemento menor ou igual a e
   E higher(E e)      //primeiro elemento maior a e
   E ceiling(E e)     //primeiro elemento maior ou igual a e
   E pollFirst()      //remove e retorna o primeiro elemento ou null
   E pollLast()       //remove e retorna o ultimo elemento ou null
   Iterator<E> descendingIterator()
   NavigableSet<E> descendingSet()
   NavigableSet<E> headSet(E toElement, boolean inclusive)
   NavigableSet<E> tailSet(E fromElement, boolean inclusive)
   NavigableSet<E> subSet(E from, boolean inc, E to, boolean inc)
Collections
• java.util.NavigableSet<E> extends SortedSet<E>:
   E lower(E e)       //primeiro elemento menor a e
   E floor(E e)       //primeiro elemento menor ou igual a e
   E higher(E e)      //primeiro elemento maior a e
   E ceiling(E e)     //primeiro elemento maior ou igual a e
   E pollFirst()      //remove e retorna o primeiro elemento ou null
   E pollLast()       //remove e retorna o ultimo elemento ou null
   Iterator<E> descendingIterator()   //Iterator na ordem inversa
   NavigableSet<E> descendingSet()
   NavigableSet<E> headSet(E toElement, boolean inclusive)
   NavigableSet<E> tailSet(E fromElement, boolean inclusive)
   NavigableSet<E> subSet(E from, boolean inc, E to, boolean inc)
Collections
• java.util.NavigableSet<E> extends SortedSet<E>:
   E lower(E e)       //primeiro elemento menor a e
   E floor(E e)       //primeiro elemento menor ou igual a e
   E higher(E e)      //primeiro elemento maior a e
   E ceiling(E e)     //primeiro elemento maior ou igual a e
   E pollFirst()      //remove e retorna o primeiro elemento ou null
   E pollLast()       //remove e retorna o ultimo elemento ou null
   Iterator<E> descendingIterator()   //Iterator na ordem inversa
   NavigableSet<E> descendingSet() //NavigableSet inverso
   NavigableSet<E> headSet(E toElement, boolean inclusive)
   NavigableSet<E> tailSet(E fromElement, boolean inclusive)
   NavigableSet<E> subSet(E from, boolean inc, E to, boolean inc)
Collections
• java.util.NavigableSet<E> extends SortedSet<E>:
   E lower(E e)       //primeiro elemento menor a e
   E floor(E e)       //primeiro elemento menor ou igual a e
   E higher(E e)      //primeiro elemento maior a e
   E ceiling(E e)     //primeiro elemento maior ou igual a e
   E pollFirst()                                      Igual aos métodos da
                      //remove e retorna o primeiro elemento ou null
                                                    classe SortedSet porém
   E pollLast()       //remove e retorna o ultimo elemento pode escolher
                                                    aqui você ou null
   Iterator<E> descendingIterator()                 se o elemento enviado é
                                      //Iterator na ordem inversa
                                                     inclusive ou exclusive.
   NavigableSet<E> descendingSet() //NavigableSet inverso
   NavigableSet<E> headSet(E toElement, boolean inclusive)
   NavigableSet<E> tailSet(E fromElement, boolean inclusive)
   NavigableSet<E> subSet(E from, boolean inc, E to, boolean inc)
Collections
• Existem mais interfaces de Collection ?
   – Que descendam de Collection? nenhuma que vá cair na prova!
     Mas é bastante vasta a Java Collection Framework
Collections
• Existem mais interfaces de Collection ?
   – Que descendam de Collection? nenhuma que vá cair na prova!
     Mas é bastante vasta a Java Collection Framework
• Sobre interfaces só falta Map<E> e suas sub-interfaces,
  mas este nós só vamos ver depois das classes
  Concretas de Collection.
Collections
• Existem mais interfaces de Collection ?
   – Que descendam de Collection? nenhuma que vá cair na prova!
     Mas é bastante vasta a Java Collection Framework
• Sobre interfaces só falta Map<E> e suas sub-interfaces,
  mas este nós só vamos ver depois das classes
  Concretas de Collection.
• Então vamos as classes concretas
<<Interface>>
        Collection<E>
                        Collections
        <<Interface>>
           List<E>


Vector<E>         ArrayList<E>

• Para o exame você só precisa saber que as duas
  classes tem a mesma implementação, exceto pela
  sincronização:
   – Vector: tem todos os seus métodos sincronizados
   – ArrayList: NÃO tem os métodos sincronizados.
• Só ter os métodos sincronizados não garante a classe
  que ela é Thread safe, por isso muito cuidado com as
  perguntas da prova, e é aconselhável o uso de ArrayList
  pois Vector é mais lenta devido a sync
<<Interface>>
           Collection<E>
                             Collections
<<Interface>>        <<Interface>>
   List<E>            Queue<E>


 •
LinkedList<E>      PriorityQueue<E>

 •   LinkedList: Implementa List e Queue, portanto tem todas
     funcionalidades de List além da Fila, onde o modelo de fila
     implementado é FIFO (firs-in-first-out).
 •   PriorityQueue: Essa é uma das poucas que apenas a
     implementação não da todas as pistas, PriorityQueue é uma fila
     classificada, ou seja, respeita a classificação natural dos elementos
     ou de um Comparator.
      – priorityQueue.poll() retorna sempre o menor elemento (de acordo com o
        Comparator da fila ou a ordem natural).
      – A PriorityQueue aceita valores duplicados
      – Não usar Comparator com objetos não classificáveis gera exceção ao
        tentar adicionar elementos.
<<Interface>>
 Collection<E>
                         Collections
 <<Interface>>
    Set<E>        • TreeSet: uma das classes mais
                    interessante e que mais cai na prova:
 <<Interface>>       – É uma coleção de elementos únicos em
 SortedSet<E>          relação a classificação definida.
                     – Deve-se usar Comparator, quando não se quer
                       usar, ou não existe, uma classificação natural.
 <<Interface>>
NavigableSet<E>      – Usar a classe sem Comparator com um objeto
                       sem classificação natural gera exceção ao
                       adicionar o elemento.
  TreeSet<E>         – Se a comparação retornar igual para dois
                       elementos, e eles não forem iguais, o TreeSet
                       não deixará incluir os dois elementos, será
                       considerado para o Set como elementos
                       duplicados, o que não é permitido, e false será
                       retornado.
                     – Estudem os métodos subSet, tailSet, headSet
Collections
•   Bom chegou a hora, vamos para as classes hash, e portanto
    precisamos explicar pra que serve o código hash e como as classes
    se comportam.
•   Antes de verificar o comportamento de uma coleção hash,
    precisamos ver como as demais se comportam.
    – Sempre que você da um contains(Object o), a coleção começa a
      verificar seus objetos testando uma a um se o.equals(next) ate
      encontrar o objeto, retornando se encontrou ou não.
    – Quando o método usado é remove(Object o), o processo é o mesmo a
      coleção testa equals um a um ate encontrar um objeto igual e o
      remove.
    – Se a coleção for um Set, a cada add(Object o), antes de adicionar a
      coleção verifica se contains(Object o), daí você começa a entender o
      problema e as implicações de ficar percorrendo a coleção tantas vezes
      testando tantos equals.
Collections
• Para resolver esse problema de performance que vai se
  acumulando as coleções hash se usam de outro
  conceito para fazer busca de seus elementos.
• Primeiro vamos revisar duas das propriedades do
  hashCode:
Collections
• Para resolver esse problema de performance que vai se
  acumulando as coleções hash se usam de outro
  conceito para fazer busca de seus elementos.
• Primeiro vamos revisar duas das propriedades do
  hashCode:
Collections
• Para resolver esse problema de performance que vai se
  acumulando as coleções hash se usam de outro
  conceito para fazer busca de seus elementos.
• Primeiro vamos revisar duas das propriedades do
  hashCode:
   – Se dois objetos a e b forem iguais e a.equals(b) for true então
     a.hashCode() == b.hashCode()
   – O inverso não é verdadeiro, quando a.equals(b) for false os
     hashCode() podem ser iguais ou diferentes.
Collections
• Para resolver esse problema de performance que vai se
  acumulando as coleções hash se usam de outro
  conceito para fazer busca de seus elementos.
• Primeiro vamos revisar duas das propriedades do
  hashCode:
   – Se dois objetos a e b forem iguais e a.equals(b) for true então
     a.hashCode() == b.hashCode()
   – O inverso não é verdadeiro, quando a.equals(b) for false os
     hashCode() podem ser iguais ou diferentes.
• As coleções hash se utilizam desses dois conceitos para
  otimizar a pesquisa a seus elementos.
Collections
• Quando você adiciona um elemento a uma coleção hash
  ela verifica o hashCode do objeto, e o coloca em um
  recipiente onde só há objetos com o mesmo hashCode,
  se o recipiente para aquele hashCode ainda não existia
  ela cria um novo.
   – Assim é mantido o processo sempre que se adiciona um objeto.
• Quando você, por exemplo, precisa verificar se um
  objeto existe, as coleções hash tem muito menos
  trabalho para procurar:
   – primeiro elas verificam o código hash do objeto, e olha no
     recipiente daquele código
   – E então verifica um a um, apenas nesse recipiente, através de
     equals() para ver se há algum objeto que coiencidente.
Collections
• Quando você adiciona um elemento a uma coleção hash
  ela verifica o hashCode do objeto, e o coloca em um
  recipiente onde só há objetos com o mesmo hashCode,
  se o recipiente para aquele hashCode ainda não existia
  ela cria um novo.
   – Assim é mantido o processo sempre que se adiciona um objeto.
• Quando você, por exemplo, precisa verificar se um
  objeto existe, as coleções hash tem muito menos
  trabalho para procurar:
   – primeiro elas verificam o código hash do objeto, e olha no
     recipiente daquele código
   – E então verifica um a um, apenas nesse recipiente, através de
     equals() para ver se há algum objeto que coiencidente.
Collections
• Quando você adiciona um elemento a uma coleção hash
  ela verifica o hashCode do objeto, e o coloca em um
  recipiente onde só há objetos com o mesmo hashCode,
  se o recipiente para aquele hashCode ainda não existia
  ela cria um novo.
   – Assim é mantido o processo sempre que se adiciona um objeto.
• Quando você, por exemplo, precisa verificar se um
  objeto existe, as coleções hash tem muito menos
  trabalho para procurar:
   – primeiro elas verificam o código hash do objeto, e olha no
     recipiente daquele código
   – E então verifica um a um, apenas nesse recipiente, através de
     equals() para ver se há algum objeto que coincidente.
Collections
•   Portanto a performance e o funcionamento de uma coleção hash
    esta intimamente ligada ao quão bem implementado é um código
    hash.
•   Para um melhor entendimento vamos criar uma classe Aluno:
    public class Aluno {
      private String nome;
      public Aluno(String nome) { this.nome = nome;}
      public String getNome() { return this.nome;}
      @Override public boolean equals(Object o) {
         if (nome == null) return false;
         return (o instanceof Aluno) && nome.equals(((Aluno)o).nome);
      }
      @Override public int hashCode() { //hashCode vem da 1° letra do nome
         return (nome == null) ? 0 : nome.charAt(0);
      }
    }
Collections
•   Portanto a performance e o funcionamento de uma coleção hash
    esta intimamente ligada ao quão bem implementado é um código
    hash.
•   Para um melhor entendimento vamos criar uma classe Aluno:
    public class Aluno {
      private String nome;
      public Aluno(String nome) { this.nome = nome;}
      public String getNome() { return this.nome;}
      @Override public boolean equals(Object o) {
         if (nome == null) return false;
         return (o instanceof Aluno) && nome.equals(((Aluno)o).nome);
      }
      @Override public int hashCode() { //hashCode vem da 1° letra do nome
         return (nome == null) ? 0 : nome.charAt(0);
      }
    }
Collections
•   Portanto a performance e o funcionamento de uma coleção hash
    esta intimamente ligada ao quão bem implementado é um código
    hash.
•   Para um melhor entendimento vamos criar uma classe Aluno:
    public class Aluno {
      private String nome;
      public Aluno(String nome) { this.nome = nome;}
      public String getNome() { return this.nome;}
      @Override public boolean equals(Object o) {
         if (nome == null) return false;
         return (o instanceof Aluno) && nome.equals(((Aluno)o).nome);
      }
      @Override public int hashCode() { //hashCode vem da 1° letra do nome
         return (nome == null) ? 0 : nome.charAt(0);
      }
    }
Collections
• Como é a divisão em uma coleção Hash?       HashSet
  Set<Aluno> alunos = new HashSet<Aluno>();
Collections
• Como é a divisão em uma coleção Hash?       HashSet
  Set<Aluno> alunos = new HashSet<Aluno>();
  alunos.add(new Aluno(“Marcos”));
                                                77
  alunos.add(new Aluno(“Matheus”));
  alunos.add(new Aluno(“Magno”));
Collections
• Como é a divisão em uma coleção Hash?       HashSet
  Set<Aluno> alunos = new HashSet<Aluno>();
  alunos.add(new Aluno(“Marcos”));
                                                77
  alunos.add(new Aluno(“Matheus”));
  alunos.add(new Aluno(“Magno”));
Collections
• Como é a divisão em uma coleção Hash?       HashSet
  Set<Aluno> alunos = new HashSet<Aluno>();
  alunos.add(new Aluno(“Marcos”));
                                                77
  alunos.add(new Aluno(“Matheus”));
  alunos.add(new Aluno(“Magno”));
  alunos.add(new Aluno(“Antonio”));             66
  alunos.add(new Aluno(“Ana”));
Collections
• Como é a divisão em uma coleção Hash?       HashSet
  Set<Aluno> alunos = new HashSet<Aluno>();
  alunos.add(new Aluno(“Marcos”));
                                                77
  alunos.add(new Aluno(“Matheus”));
  alunos.add(new Aluno(“Magno”));
  alunos.add(new Aluno(“Antonio”));             66
  alunos.add(new Aluno(“Ana”));
  alunos.add(new Aluno(“João”));
                                                74
Collections
•    Como é a divisão em uma coleção Hash?                   HashSet
    Set<Aluno> alunos = new HashSet<Aluno>();
    alunos.add(new Aluno(“Marcos”));
                                                                 77
    alunos.add(new Aluno(“Matheus”));
    alunos.add(new Aluno(“Magno”));
    alunos.add(new Aluno(“Antonio”));
    alunos.add(new Aluno(“Ana”));
                                                                 66
    alunos.add(new Aluno(“João”));

    Como então funciona um:                                       74
       alunos.contains(new Aluno(“Jô”)) ?
    1. A coleção busca “Jô”.hashCode() == 74
    2. A coleção busca o conteiner 74
    3. Então verifica todos os elementos que neste caso é apenas “João”
       testando: “João”.equals(“Jô”); o que retorna false e acaba o processo
Collections
• Quanto melhor implementado é o hashCode() mais
  rápida se torna a busca dentro da coleção hash, por
  exemplo, se mudarmos nossa implementação de
  hashCode() para:
   public class Aluno {
     //...
     @Override
     public int hashCode() { //hashCode vem da 1° letra do nome
        return (nome == null) ? 0 : nome.charAt(0) + nome.size();
     }
   }
Collections                     HashSet

•    Como seria a nova divisão ??          7*77
                                                          539

    alunos.add(new Aluno(“Matheus”));             5*77
                                                          385
    alunos.add(new Aluno(“Magno”));
                                              6*77
    alunos.add(new Aluno(“Marcos”));
    alunos.add(new Aluno(“Antonio”));             7*66
                                                          462
    alunos.add(new Aluno(“Ana”));
    alunos.add(new Aluno(“João”));            3*66        198
                                              4*74
    Como então funciona um:                               296
       alunos.contains(new Aluno(“Jô”)) ?
    1. A coleção busca “Jô”.hashCode() == 148
    2. A coleção verifica que não há o conteiner 148
    3. o que retorna false e acaba o processo
Collections
• Como coleções não hash realizam a mesma busca?
   Aluno jo = new Aluno(“Jô”);
   alunos.contains(jo);
   //A coleção alunos iria testar equals contra cada objeto:
      “Matheus”.equals(jo); //false
      “Magno”.equals(jo); //false
      “Marcos”.equals(jo); //false
      “Antonio”.equals(jo); //false
      “Ana”.equals(jo); //false
      “João”.equals(jo); //false
      return false;
• E essa é diferença de performance de uma coleção
  hash para uma normal.
Collections
• Como coleções não hash realizam a mesma busca?
   Aluno jo = new Aluno(“Jô”);
   alunos.contains(jo);
   //A coleção alunos iria testar equals contra cada objeto:
      “Matheus”.equals(jo); //false
      “Magno”.equals(jo); //false
      “Marcos”.equals(jo); //false
      “Antonio”.equals(jo); //false
      “Ana”.equals(jo); //false
      “João”.equals(jo); //false
      return false;
• E essa é diferença de performance de uma coleção
  hash para uma normal.
<<Interface>>
  Collection<E>
                            Collections
  <<Interface>>
     Set<E>        •   HashSet: uma das classes mais utilizadas (e que
                       pode gerar grandes problemas quando hashCode
  HashSet<E>
                       não é bem implementado):
                       – É uma coleção de elementos únicos não ordenada e
                         não classificada.
                       – A cada inserção a ordem dos elementos gerados pelo
LinkedHashSet<E>         iterator pode alterar totalmente.
                       – As buscas são realizadas usando tabelas hash.
                   •   LinkedHashSet: A mudança básica para o
                       HashSet é que a LinkedHashSet mantém
                       armazenada a ordem de inserção.
                       – A cada inserção a ordem dos elementos gerados pelo
                         iterator NÃO é alterada.
                       – É mantida a ordem de inserção.
                       – As buscas são realizadas usando tabelas hash.
Collections
• Finalmente vamos conhecer o funcionamento
  dos java.util.Map<K,V>
• Um Map é uma coleção de pares key-value
  (chave-valor), porem esta não descende de
  Collection<E> tendo uma interface nova.
• Por exemplo:
  – Em um Map<String,Thread> podemos guardar
    instancias de Thread que são identificadas por
    Strings, onde é possivel gerenciar facilmente as
    instancias através de suas chaves.
• Vamos conhecer sua interface
Collections
• Finalmente vamos conhecer o funcionamento
  dos java.util.Map<K,V>
• Um Map é uma coleção de pares key-value
  (chave-valor), porem esta não descende de
  Collection<E> tendo uma interface nova.
• Por exemplo:
  – Em um Map<String,Thread> podemos guardar
    instancias de Thread que são identificadas por
    Strings, onde é possivel gerenciar facilmente as
    instancias através de suas chaves.
• Vamos conhecer sua interface
Collections
• Finalmente vamos conhecer o funcionamento
  dos java.util.Map<K,V>
• Um Map é uma coleção de pares key-value
  (chave-valor), porem esta não descende de
  Collection<E> tendo uma interface nova.
• Por exemplo:
  – Em um Map<String,Thread> podemos guardar
    instancias de Thread que são identificadas por
    Strings, onde é possível gerenciar facilmente as
    instancias através de suas chaves.
• Vamos conhecer sua interface
Collections
• Finalmente vamos conhecer o funcionamento
  dos java.util.Map<K,V>
• Um Map é uma coleção de pares key-value
  (chave-valor), porem esta não descende de
  Collection<E> tendo uma interface nova.
• Por exemplo:
  – Em um Map<String,Thread> podemos guardar
    instancias de Thread que são identificadas por
    Strings, onde é possível gerenciar facilmente as
    instancias através de suas chaves.
• Vamos conhecer sua interface
Collections
• Métodos de java.util.Map<K,V>:
   V put(K key, V value)
   void putAll(Map<? extends K,? extends V> m)
   V remove(Object key)
   void clear()
   V get(Object key)
   boolean containsKey(Object o)
   boolean containsValue(Object o)
   Set<Map.Entry<K, V>> entrySet()
   Set<K> keySet()
   Collection<V> values()
   int size()
   boolean isEmpty()
Collections
• Métodos de java.util.Map<K,V>:
   V put(K key, V value)
   void putAll(Map<? extends K,? extends V> m)
   V remove(Object key)
   void clear()                      Insere o valor passado na
   V get(Object key)                 chave indicada, e retorna o
   boolean containsKey(Object o)     antigo valor da chave, ou null
   boolean containsValue(Object o) caso não exista valor anterior.
   Set<Map.Entry<K, V>> entrySet()
   Set<K> keySet()                   Implementação é opcional.
   Collection<V> values()
   int size()
   boolean isEmpty()
Collections
• Métodos de java.util.Map<K,V>:
   V put(K key, V value)
   void putAll(Map<? extends K,? extends V> m)
   V remove(Object key)
   void clear()                      Copia todos os valores do
   V get(Object key)                 mapa enviando m, para este
   boolean containsKey(Object o)     mapa, nas suas respectivas
   boolean containsValue(Object o) chaves.
   Set<Map.Entry<K, V>> entrySet() É o mesmo que iterar o
   Set<K> keySet()                   entrySet() e adicionar as
   Collection<V> values()            entradas uma a uma.
   int size()
   boolean isEmpty()                 Implementação é opcional.
Collections
• Métodos de java.util.Map<K,V>:
   V put(K key, V value)
   void putAll(Map<? extends K,? extends V> m)
   V remove(Object key)
   void clear()                      Remove, se estiver presente,
   V get(Object key)                 o mapeamento de chave
   boolean containsKey(Object o)     enviada, retornando o valor da
   boolean containsValue(Object o) chave que estava mapeado.
   Set<Map.Entry<K, V>> entrySet()
   Set<K> keySet()                   Implementação é opcional.
   Collection<V> values()
   int size()
   boolean isEmpty()
Collections
• Métodos de java.util.Map<K,V>:
   V put(K key, V value)
   void putAll(Map<? extends K,? extends V> m)
   V remove(Object key)
   void clear()                      Remove todos as chaves e
   V get(Object key)                 valores mapeados.
   boolean containsKey(Object o)
   boolean containsValue(Object o) Implementação é opcional.
   Set<Map.Entry<K, V>> entrySet()
   Set<K> keySet()
   Collection<V> values()
   int size()
   boolean isEmpty()
Collections
• Métodos de java.util.Map<K,V>:
   V put(K key, V value)
   void putAll(Map<? extends K,? extends V> m)
   V remove(Object key)
   void clear()                      Recupera o valor para a chave
   V get(Object key)                 enviada.
   boolean containsKey(Object o)
   boolean containsValue(Object o)
   Set<Map.Entry<K, V>> entrySet()
   Set<K> keySet()
   Collection<V> values()
   int size()
   boolean isEmpty()
Collections
• Métodos de java.util.Map<K,V>:
   V put(K key, V value)
   void putAll(Map<? extends K,? extends V> m)
   V remove(Object key)
   void clear()                      Verifica se este mapa contém
   V get(Object key)                 uma chave significantemente
   boolean containsKey(Object o)     igual ao objeto enviado.
   boolean containsValue(Object o)
   Set<Map.Entry<K, V>> entrySet()
   Set<K> keySet()
   Collection<V> values()
   int size()
   boolean isEmpty()
Collections
• Métodos de java.util.Map<K,V>:
   V put(K key, V value)
   void putAll(Map<? extends K,? extends V> m)
   V remove(Object key)
   void clear()                      Verifica se este mapa contém
   V get(Object key)                 uma valor significantemente
   boolean containsKey(Object o)     igual ao objeto enviado.
   boolean containsValue(Object o)
   Set<Map.Entry<K, V>> entrySet()
   Set<K> keySet()
   Collection<V> values()
   int size()
   boolean isEmpty()
Collections
• Métodos de java.util.Map<K,V>:
   V put(K key, V value)
   void putAll(Map<? extends K,? extends V> m)
   V remove(Object key)
   void clear()                      Recupera a coleção Set das
   V get(Object key)                 Entry deste mapa.
   boolean containsKey(Object o)     Entry são Entradas do mapa é
   boolean containsValue(Object o) um objeto que guarda o par
   Set<Map.Entry<K, V>> entrySet() key-value.
   Set<K> keySet()                   Veremos na pagina seguinte
   Collection<V> values()            como funciona essa interface
   int size()                        Entry.
   boolean isEmpty()                 Alterações nesse Set são
                                   refletidas no Map e vice-versa,
                                   muito cuidado ao manipular.
Collections
• Métodos de java.util.Map<K,V>:
   V put(K key, V value)
   void putAll(Map<? extends K,? extends V> m)
   V remove(Object key)
   void clear()                      Recupera um Set contendo
   V get(Object key)                 todas as chaves do Map.
   boolean containsKey(Object o)
   boolean containsValue(Object o) Alterações nesse Set são
   Set<Map.Entry<K, V>> entrySet() refletidas no Map e vice-versa,
   Set<K> keySet()                   muito cuidado ao manipular.
   Collection<V> values()
   int size()
   boolean isEmpty()
Collections
• Métodos de java.util.Map<K,V>:
   V put(K key, V value)
   void putAll(Map<? extends K,? extends V> m)
   V remove(Object key)
   void clear()                      Recupera uma Collection
   V get(Object key)                 contendo todos os valores
   boolean containsKey(Object o)     deste Map.
   boolean containsValue(Object o)
   Set<Map.Entry<K, V>> entrySet() Alterações nesse Set são
   Set<K> keySet()                   refletidas no Map e vice-versa,
   Collection<V> values()            muito cuidado ao manipular.
   int size()
   boolean isEmpty()
Collections
• Métodos de java.util.Map<K,V>:
   V put(K key, V value)
   void putAll(Map<? extends K,? extends V> m)
   V remove(Object key)
   void clear()                      Informa a quantidade de pares
   V get(Object key)                 key-value existentes neste
   boolean containsKey(Object o)     mapa.
   boolean containsValue(Object o)
   Set<Map.Entry<K, V>> entrySet()
   Set<K> keySet()
   Collection<V> values()
   int size()
   boolean isEmpty()
Collections
• Métodos de java.util.Map<K,V>:
   V put(K key, V value)
   void putAll(Map<? extends K,? extends V> m)
   V remove(Object key)
   void clear()                      Verifica se o Map é vazio
   V get(Object key)                 Método de comodidade, o
   boolean containsKey(Object o)     mesmo que (size() == 0)
   boolean containsValue(Object o)
   Set<Map.Entry<K, V>> entrySet()
   Set<K> keySet()
   Collection<V> values()
   int size()
   boolean isEmpty()
Collections
• Métodos de java.util.Map.Entry<K,V>:
  K getKey()
  V getValue()
  V setValue(V value)
Collections
• Métodos de java.util.Map.Entry<K,V>:
  K getKey()          //recupera a chave desta entrada
  V getValue()
  V setValue(V value)
Collections
• Métodos de java.util.Map.Entry<K,V>:
  K getKey()          //recupera a chave desta entrada
  V getValue()        //recupera o valor desta entrada
  V setValue(V value)
Collections
• Métodos de java.util.Map.Entry<K,V>:
  K getKey()          //recupera a chave desta entrada
  V getValue()        //recupera o valor desta entrada
  V setValue(V value) //altera o valor para esta chave
Collections
• A uma interface em maps que também é
  classificada java.util.SortedMap<K,V>:
  – Esta interface tem exatamente o mesmo funcionamento da
    Coleção SortedSet, porém se aplica a parte de Keys do Map
Collections
• Métodos de java.util.SortedMap<K,V>:
  Comparator<? super K> comparator()
  K firstKey()
  SortedMap<K,V> tailMap(K fromKey)
  K lastKey()
  SortedMap<K,V> headMap(K toKey)
  SortedMap<K,V> subMap(K fromKey, K toKey)
Collections
• Métodos de java.util.SortedMap<K,V>:
  Comparator<? super K> comparator()
  K firstKey()                             Funciona igual
  SortedMap<K,V> tailMap(K fromKey)     SortedSet para o Set
                                          de keys do Map
  K lastKey()
  SortedMap<K,V> headMap(K toKey)
  SortedMap<K,V> subMap(K fromKey, K toKey)
Collections
• Também existe a interface semelhante a
  NavigableSet com mais funcionalidades
  java.util.NavigableMap<K,V>:
  – Esta interface tem exatamente o mesmo
    funcionamento da Coleção NavigableSet,
    porém se aplica a parte de keys do Map
Collections
•   Métodos de java.util.NavigableMap<K,V>:
    K lowerKey(K key)
    Entry<K,V> lowerEntry(E key)
    K floorKey(K e)
    Entry<K,V> floorEntry(E key)                   Funciona igual
    E higherKey(K key)                         NavigableSet para o
    Entry<K,V> higherEntry(K key)               Set de keys do Map
    E ceilingKey(K key)
    Entry<K,V> ceilingEntry(K key)
    Entry<K,V> pollFirstEntry()
    Entry<K,V> pollLastEntry()
    NavigableSet<K> descendingKeySet()
    NavigableMap<K,V> descendingMap()
    NavigableMap<K,V> headMap(K toElement, boolean inclusive)
    NavigableMap<K,V> tailMap(K fromElement, boolean inclusive)
    NavigableMap<K,V> subMap(K from, boolean inc, K to, boolean inc)
Collections
• As classes concretas de Map que cai no
  exame são também muito semelhantes a
  classes concretas Collection que já
  estudamos:
  – Examinamos agora as classes concretas.
Collections
Collections
Collections

         Hashtable e HashMap
        Semelhanças: Não
        ordenadas, não
        classificadas, baseiam
        suas buscas em tabelas
        rash.
        Diferenças: Hashtable tem
        todos os seus métodos
        sincronizados enquanto
        HashMap não!
        é aconselhável o uso do
        HashMap
Collections

           LinkedHashMap
        Semelhanças: não
        classificadas, baseiam
        suas buscas em tabelas
        rash.
        Diferenças: A ordem de
        inserção é levada em
        conta, e a iteração de seus
        entrySet(), keySet() ou
        values() obedecem a
        ordem de inserção.
        Obs.: não é sincronizada.
Collections

      TreeMap

É um Map classificado
onde a ordem dos seus
elementos segue a
ordem de seu
Comparator (se
houver) ou a natural
de seus elementos.
Funciona semelhante
a TreeSet.
Collections
• Vários métodos utilitários podem ser
  encontrados na classe java.util.Collections,
  sim Collections com “s” no fim.
• Esta classe esta munida das principais
  operações que você precisará realizar com
  Coleções, e todos os seus métodos são
  estáticos.
• Sua documentação pode ser encontrada neste
  link:
  – http://java.sun.com/javase/6/docs/api/java/util/Collecti
    ons.html
Collections
• Vários métodos utilitários podem ser
  encontrados na classe java.util.Collections,
  sim Collections com “s” no fim.
• Esta classe esta munida das principais
  operações que você precisará realizar com
  Coleções, e todos os seus métodos são
  estáticos.
• Sua documentação pode ser encontrada neste
  link:
  – http://java.sun.com/javase/6/docs/api/java/util/Collecti
    ons.html
Collections
• Vários métodos utilitários podem ser
  encontrados na classe java.util.Collections,
  sim Collections com “s” no fim.
• Esta classe esta munida das principais
  operações que você precisará realizar com
  Coleções, e todos os seus métodos são
  estáticos.
• Sua documentação pode ser encontrada neste
  link:
  – http://java.sun.com/javase/6/docs/api/java/util/Collecti
    ons.html
Collections
•   Existe mais alguma interface ou classe concreta? Da Java
    Collections Framework ??
    – SIM, existe! Mas essas são todas que são usadas no exame.
•   Onde eu posso encontrar mais informações ?
    – GUJ: http://www.guj.com.br/
    – Sergio Taborda’s Weblog:
      http://sergiotaborda.wordpress.com/java/colecoes-em-java/
    – Tomaz Lavieri’s Blog: http://java-i9se.blogspot.com/
    – Tutorial da sun:
      http://java.sun.com/docs/books/tutorial/collections/index.html
    – API Specification:
      http://java.sun.com/javase/6/docs/technotes/guides/collections/referenc
      e.html
    – The Java Collection Framework Documentations Contents:
      http://java.sun.com/javase/6/docs/technotes/guides/collections/index.ht
      ml
Collections
•   Existe mais alguma interface ou classe concreta? Da Java
    Collections Framework ??
    – SIM, existe! Mas essas são todas que são usadas no exame.
•   Onde eu posso encontrar mais informações ?
    – GUJ: http://www.guj.com.br/
    – Sergio Taborda’s Weblog:
      http://sergiotaborda.wordpress.com/java/colecoes-em-java/
    – Tomaz Lavieri’s Blog: http://java-i9se.blogspot.com/
    – Tutorial da sun:
      http://java.sun.com/docs/books/tutorial/collections/index.html
    – API Specification:
      http://java.sun.com/javase/6/docs/technotes/guides/collections/referenc
      e.html
    – The Java Collection Framework Documentations Contents:
      http://java.sun.com/javase/6/docs/technotes/guides/collections/index.ht
      ml
Collections
•   Existe mais alguma interface ou classe concreta? Da Java
    Collections Framework ??
    – SIM, existe! Mas essas são todas que são usadas no exame.
•   Onde eu posso encontrar mais informações ?
    – GUJ: http://www.guj.com.br/
    – Sergio Taborda’s Weblog:
      http://sergiotaborda.wordpress.com/java/colecoes-em-java/
    – Tomaz Lavieri’s Blog: http://java-i9se.blogspot.com/
    – Tutorial da sun:
      http://java.sun.com/docs/books/tutorial/collections/index.html
    – API Specification:
      http://java.sun.com/javase/6/docs/technotes/guides/collections/referenc
      e.html
    – The Java Collection Framework Documentations Contents:
      http://java.sun.com/javase/6/docs/technotes/guides/collections/index.ht
      ml
Collections
•   Existe mais alguma interface ou classe concreta? Da Java
    Collections Framework ??
    – SIM, existe! Mas essas são todas que são usadas no exame.
•   Onde eu posso encontrar mais informações ?
    – GUJ: http://www.guj.com.br/
    – Sergio Taborda’s Weblog:
      http://sergiotaborda.wordpress.com/java/colecoes-em-java/
    – Tomaz Lavieri’s Blog: http://java-i9se.blogspot.com/
    – Tutorial da sun:
      http://java.sun.com/docs/books/tutorial/collections/index.html
    – API Specification:
      http://java.sun.com/javase/6/docs/technotes/guides/collections/referenc
      e.html
    – The Java Collection Framework Documentations Contents:
      http://java.sun.com/javase/6/docs/technotes/guides/collections/index.ht
      ml
Collections
• Referencias Bibliográficas:
  – API Java 6:
    http://java.sun.com/javase/6/docs/technotes/g
    uides/collections/reference.html
  – Livro: Certificação Sun® Para Programador
    Java 6 – Guia de Estudos – 2° Edição

Mais conteúdo relacionado

DOC
Pdc 2011 15
PDF
Política Desenvolvimento Coleção
PDF
Preparando sua biblioteca_para_avalia_ca_o_do_mec
ODP
Java 12 Colecoes
PDF
Manual procedimentos
PPT
Seleção e Aquisição de títulos
PPT
Avaliação e Internet
PPT
Avaliação de coleções do acervo do curso de Graduação de Espanhol
Pdc 2011 15
Política Desenvolvimento Coleção
Preparando sua biblioteca_para_avalia_ca_o_do_mec
Java 12 Colecoes
Manual procedimentos
Seleção e Aquisição de títulos
Avaliação e Internet
Avaliação de coleções do acervo do curso de Graduação de Espanhol

Destaque (12)

PPTX
Bibliotecas e evolucao 2.0
PDF
Relatório de avaliação da Biblioteca ESSPS - Domínio D
PDF
Avaliação de coleções - Biblioteca Central do Gragoatá
PPT
Desenvolvimento de coleções em bibliotecas universitárias
PDF
Pdc. be. ag. vila d'este 1
PDF
Avaliação da Classe 7-subclasse 7.01
PPTX
3 Desenvolvimento de coleções: comunidade usuária
PPTX
7 Desenvolvimento de coleções: avaliação
PDF
Política de Desenvolvimento da Coleção
PPTX
2 Desenvolvimento de coleções: política
PPT
Desenvolvimento de Coleções
PDF
Aulas de desenvolvimento de coleção
Bibliotecas e evolucao 2.0
Relatório de avaliação da Biblioteca ESSPS - Domínio D
Avaliação de coleções - Biblioteca Central do Gragoatá
Desenvolvimento de coleções em bibliotecas universitárias
Pdc. be. ag. vila d'este 1
Avaliação da Classe 7-subclasse 7.01
3 Desenvolvimento de coleções: comunidade usuária
7 Desenvolvimento de coleções: avaliação
Política de Desenvolvimento da Coleção
2 Desenvolvimento de coleções: política
Desenvolvimento de Coleções
Aulas de desenvolvimento de coleção
Anúncio

Semelhante a Collections E Generics (20)

PDF
Java Collections - Tomaz Lavieri
PPT
Classes Java , JDBC / Swing / Collections
PPTX
PPTX
Curso Java Básico - Aula 05
PPTX
Java: Collections
PDF
Java 07
PDF
Pacotes e Encapsulamento
PDF
Pacotes e Encapsulamento
PPTX
Java: Classes Abstratas, Anônimas, Interface
PPTX
Java: Estruturas de Repetição
PPTX
Aprendendo C# do zero
PDF
Swift!.opcionais.oh!.my()?!?
PDF
[CRASHCOURSE] Orientação a Objeto e UML
ODP
Curso de Delphi - Lógica de Programacao
KEY
Introdução a java
PDF
Aprendendo Kotlin na Prática
ODP
Slide Semana2 Rodrigo
KEY
A linguagem maislegaldomundo
PPTX
Java - Visão geral e Exercícios
PPTX
Csharp fundamentals
Java Collections - Tomaz Lavieri
Classes Java , JDBC / Swing / Collections
Curso Java Básico - Aula 05
Java: Collections
Java 07
Pacotes e Encapsulamento
Pacotes e Encapsulamento
Java: Classes Abstratas, Anônimas, Interface
Java: Estruturas de Repetição
Aprendendo C# do zero
Swift!.opcionais.oh!.my()?!?
[CRASHCOURSE] Orientação a Objeto e UML
Curso de Delphi - Lógica de Programacao
Introdução a java
Aprendendo Kotlin na Prática
Slide Semana2 Rodrigo
A linguagem maislegaldomundo
Java - Visão geral e Exercícios
Csharp fundamentals
Anúncio

Último (20)

PDF
Um dia na casa do Mensageiro (que a paz e benção de Deus estejam com ele)
PPT
História e Evolução dos Computadores domésticos
PDF
metabolismo energtico das clulas-131017092002-phpapp02.pdf
PDF
A relação entre funções executivas e desempenho acadêmico em crianças com Tra...
PPTX
Revolução Industrial - Aula Expositiva - 3U4.pptx
PDF
50 anos Hoje - Volume V - 1973 - Manaus Amazonas
PPTX
GUERRAFRIA.pptdddddddddddddddddddddddddx
PPTX
INDÚSTRIA_ Histórico da industrialização.pptx
DOC
PPP 2024 (2) (2) feito EM REELABORAÇÃO MORENA ( ABRIL 2024).doc
PPTX
NR11 - Treinamento Direcao Defensiva - 2023.pptx
PPTX
ACIDOS NUCLEICOS - REPLICAÇÃO DO DNA - E.M.
PPTX
QuestõesENEMVESTIBULARPARAESTUDOSEAPRENDIZADO.pptx
PDF
[Slides] A Literatura no ENEM 2017 (1).pdf
PPT
HISTOLOGIA VEGETAL - tecidos vegetais.ppt
PPTX
TREINAMENTO DE INSPETOR DE ANDAIMES.pptx
PDF
RELATÓRIO DE ESTÁGIO SURVISIONADO: NEUROPSICOPEDAGOGIA INSTITUCIONAL, CLÍNIC...
PDF
Metabolismo_energético_3ano_pre_vest_2026.pdf
PPTX
norma regulamentadora numero vinte nr 20
PDF
A Revolução Francesa de 1789 slides história
PPTX
Ocupação e transformação dos territórios.pptx
Um dia na casa do Mensageiro (que a paz e benção de Deus estejam com ele)
História e Evolução dos Computadores domésticos
metabolismo energtico das clulas-131017092002-phpapp02.pdf
A relação entre funções executivas e desempenho acadêmico em crianças com Tra...
Revolução Industrial - Aula Expositiva - 3U4.pptx
50 anos Hoje - Volume V - 1973 - Manaus Amazonas
GUERRAFRIA.pptdddddddddddddddddddddddddx
INDÚSTRIA_ Histórico da industrialização.pptx
PPP 2024 (2) (2) feito EM REELABORAÇÃO MORENA ( ABRIL 2024).doc
NR11 - Treinamento Direcao Defensiva - 2023.pptx
ACIDOS NUCLEICOS - REPLICAÇÃO DO DNA - E.M.
QuestõesENEMVESTIBULARPARAESTUDOSEAPRENDIZADO.pptx
[Slides] A Literatura no ENEM 2017 (1).pdf
HISTOLOGIA VEGETAL - tecidos vegetais.ppt
TREINAMENTO DE INSPETOR DE ANDAIMES.pptx
RELATÓRIO DE ESTÁGIO SURVISIONADO: NEUROPSICOPEDAGOGIA INSTITUCIONAL, CLÍNIC...
Metabolismo_energético_3ano_pre_vest_2026.pdf
norma regulamentadora numero vinte nr 20
A Revolução Francesa de 1789 slides história
Ocupação e transformação dos territórios.pptx

Collections E Generics

  • 1. ® TM Certificação Sun para Programador Java 6 Collections Tomaz Lavieri Sun Certified Java Programmer 6 tomazlavieri@gmail.com http://java-i9se.blogspot.com.br
  • 2. Collections Objetivos: • Ao final desta apresentação espera-se que você saiba: – Distinguir cada tipo de Coleção. – Escolher a melhor implementação de Coleção para cada tipo de uso. – Saber a diferença entre as Interfaces: Collection, Set, Queue, List, SortedSet, NavigableSet, Map, SortedMap e NavigableMap. – Conhecer as implementações básicas: ArrayList, Vector, LinkedList, PriorityQueue, TreeSet, HashSet, LinkedHashSet, TreeMap, HashMap e LinkedHashMap.
  • 3. Collections Objetivos: • Ao final desta apresentação espera-se que você saiba: – Distinguir cada tipo de Coleção. – Escolher a melhor implementação de Coleção para cada tipo de uso. – Saber a diferença entre as Interfaces: Collection, Set, Queue, List, SortedSet, NavigableSet, Map, SortedMap e NavigableMap. – Conhecer as implementações básicas: ArrayList, Vector, LinkedList, PriorityQueue, TreeSet, HashSet, LinkedHashSet, TreeMap, HashMap e LinkedHashMap.
  • 4. Collections Objetivos: • Ao final desta apresentação espera-se que você saiba: – Distinguir cada tipo de Coleção. – Escolher a melhor implementação de Coleção (entre as básicas) para cada tipo de uso. – Saber a diferença entre as Interfaces: Collection, Set, Queue, List, SortedSet, NavigableSet, Map, SortedMap e NavigableMap. – Conhecer as implementações básicas: ArrayList, Vector, LinkedList, PriorityQueue, TreeSet, HashSet, LinkedHashSet, TreeMap, HashMap e LinkedHashMap.
  • 5. Collections Objetivos: • Ao final desta apresentação espera-se que você saiba: – Distinguir cada tipo de Coleção. – Escolher a melhor implementação de Coleção (entre as básicas) para cada tipo de uso. – Saber a diferença entre as Interfaces: Collection, Set, Queue, List, SortedSet, NavigableSet, Map, SortedMap e NavigableMap. – Conhecer as implementações básicas: ArrayList, Vector, LinkedList, PriorityQueue, TreeSet, HashSet, LinkedHashSet, TreeMap, HashMap e LinkedHashMap.
  • 6. Collections Objetivos: • Ao final desta apresentação espera-se que você saiba: – Distinguir cada tipo de Coleção. – Escolher a melhor implementação de Coleção (entre as básicas) para cada tipo de uso. – Saber a diferença entre as Interfaces: Collection, Set, Queue, List, SortedSet, NavigableSet, Map, SortedMap e NavigableMap. – Conhecer as implementações básicas: ArrayList, Vector, LinkedList, PriorityQueue, TreeSet, HashSet, LinkedHashSet, TreeMap, HashMap e LinkedHashMap.
  • 8. Collections • Pre-requisitos: – Igualdade: Para se trabalhar com coleções é preciso entender a igualdade em Java
  • 9. Collections • Pre-requisitos: – Igualdade: Para se trabalhar com coleções é preciso entender a igualdade em Java • Porque é preciso?
  • 10. Collections • Pre-requisitos: – Igualdade: Para se trabalhar com coleções é preciso entender a igualdade em Java • Porque é preciso? – Quando chegarmos lá tudo ficará mais claro, mas adiantando, varias funcionalidades de coleções como contains(Object o) – que verifica se existe um objeto na coleção – precisa testar a igualdade para funcionar.
  • 11. Collections • Como funciona igualdade em Java ? pessoa1 == pessoa2
  • 12. Collections • Como funciona igualdade em Java ? pessoa1 == pessoa2 • Isso irá testar apenas se as duas variáveis referenciam uma única instancia!
  • 13. Collections • Como então saber, por exemplo, quando dois objetos Pessoa são significantemente iguais?
  • 14. Collections • Como então saber, por exemplo, quando dois objetos Pessoa são significantemente iguais? – Para esse tipo de teste você deve usar um método que todo objeto Java tem equals(Object o)
  • 15. Collections • Como então saber, por exemplo, quando dois objetos Pessoa são significantemente iguais? – Para esse tipo de teste você deve usar um método que todo objeto Java tem equals(Object o) • Então nosso teste de igualdade seria: pessoa1.equals(pessoa2)
  • 17. Collections • Só isso resolve? – Não
  • 18. Collections • Só isso resolve? – Não • Por padrão o método equals de Object faz o mesmo que o operador ==
  • 19. Collections • Só isso resolve? – Não • Por padrão o método equals de Object faz o mesmo que o operador == public class Object { //.. public boolean equals(Object obj) { return (this == obj); } //…
  • 20. Collections • Então se queremos definir em nosso modelo que dois objetos Pessoa são iguais quando, por exemplo, seus cpf são iguais?
  • 21. Collections • Então se queremos definir em nosso modelo que dois objetos Pessoa são iguais quando, por exemplo, seus cpf são iguais? – Neste caso nós precisamos ensinar ao nosso programa a igualdade entre nossos objetos
  • 22. Collections • Então se queremos definir em nosso modelo que dois objetos Pessoa são iguais quando, por exemplo, seus cpf são iguais? – Neste caso nós precisamos ensinar ao nosso programa a igualdade entre nossos objetos • Como fazer isso??
  • 23. Collections • Então se queremos definir em nosso modelo que dois objetos Pessoa são iguais quando, por exemplo, seus cpf são iguais? – Neste caso nós precisamos ensinar ao nosso programa a igualdade entre nossos objetos • Como fazer isso?? – Sobrescrevendo o equals
  • 24. Collections • Mas não basta simplesmente sobrescrever!
  • 25. Collections • Mas não basta simplesmente sobrescrever! • E existe um contrato de equals que deve ser rigorosamente seguido para o bom funcionamento do programa e da Java Collections Framework
  • 26. Collections • O contrato diz que equals é: – Reflexível: a.equals(a) == true – Simétrico: a.equals(b) == b.equals(a) – Transitivo: se a.equals(b) && b.equals(c) == true .:. a.equals(c) também é true. – Consistente: a.equals(b) deve retornar sempre true ou sempre falso, desde que nenhuma propriedade do do Objeto que faz parte do teste equals seja alterada. – Deve retornar false quando testado contra uma variável null
  • 27. Collections • O contrato diz que equals é: – Reflexível: a.equals(a) == true – Simétrico: a.equals(b) == b.equals(a) – Transitivo: se a.equals(b) && b.equals(c) == true .:. a.equals(c) também é true. – Consistente: a.equals(b) deve retornar sempre true ou sempre falso, desde que nenhuma propriedade do do Objeto que faz parte do teste equals seja alterada. – Deve retornar false quando testado contra uma variável null
  • 28. Collections • O contrato diz que equals é: – Reflexível: a.equals(a) == true – Simétrico: a.equals(b) == b.equals(a) – Transitivo: se a.equals(b) && b.equals(c) == true .:. a.equals(c) também é true. – Consistente: a.equals(b) deve retornar sempre true ou sempre falso, desde que nenhuma propriedade do do Objeto que faz parte do teste equals seja alterada. – Deve retornar false quando testado contra uma variável null
  • 29. Collections • O contrato diz que equals é: – Reflexível: a.equals(a) == true – Simétrico: a.equals(b) == b.equals(a) – Transitivo: se a.equals(b) && b.equals(c) == true .:. a.equals(c) == true. – Consistente: a.equals(b) deve retornar sempre true ou sempre falso, desde que nenhuma propriedade do do Objeto que faz parte do teste equals seja alterada. – Deve retornar false quando testado contra uma variável null
  • 30. Collections • O contrato diz que equals é: – Reflexível: a.equals(a) == true – Simétrico: a.equals(b) == b.equals(a) – Transitivo: se a.equals(b) && b.equals(c) == true .:. a.equals(c) == true – Consistente: a.equals(b) deve retornar sempre true ou sempre falso, desde que nenhuma propriedade do do Objeto que faz parte do teste equals seja alterada. – Deve retornar false quando testado contra uma variável null
  • 31. Collections • Portanto para nossa classe Pessoa podemos definir um equals assim: public class Pessoa { private String cpf; //... @Override public boolean equals(Object p) { if (cpf == null) return false; return (p instanceof Pessoa) && this.cpf.equals(((Pessoa)p).cpf); } //... }
  • 32. Collections • Portanto para nossa classe Pessoa podemos definir um equals assim: public class Pessoa { private String cpf; //... @Override // não é necessário mas é bom public boolean equals(Object p) { if (cpf == null) return false; return (p instanceof Pessoa) && this.cpf.equals(((Pessoa)p).cpf); } //... }
  • 33. Collections • Portanto para nossa classe Pessoa podemos definir um equals assim: Eu não podia colocar public class Pessoa { A classe Pessoa? private String cpf; No lugar de Objeto ? //... @Override public boolean equals(Object p) { Pessoa if (cpf == null) return false; return (p instanceof Pessoa) && this.cpf.equals(((Pessoa)p).cpf); } //... }
  • 34. Collections • Portanto para nossa classe Pessoa podemos definir um equals assim: Eu não podia colocar public class Pessoa { A classe Pessoa? private String cpf; No lugar de Objeto ? //... @Override public boolean equals(Object p) { Pessoa if (cpf == null) NÃO!!!! return false; Pois é preciso return (p instanceof Pessoa) && sobrescrever o this.cpf.equals(((Pessoa)p).cpf); método da classe } Object e portanto //... manter a mesma } assinatura
  • 35. Collections • Então é isso basta sobrescrever o método equals corretamente na minha classe e já posso usar: pessoa1.equals(pessoa2) • Não preciso fazer mais nada?
  • 36. Collections • Então é isso basta sobrescrever o método equals corretamente na minha classe e já posso usar: pessoa1.equals(pessoa2) • Não preciso fazer mais nada? – ERRADO! Precisa sim! E é ai o erro mais comum de quem trabalha com collections
  • 37. Collections • Então é isso basta sobrescrever o método equals corretamente na minha classe e já posso usar: pessoa1.equals(pessoa2) • Não preciso fazer mais nada? – ERRADO! Precisa sim! E é ai o erro mais comum de quem trabalha com collections • O contrato de equals(Object o) esta fortemente ligado ao de hashCode()
  • 38. Collections • E pra que serve esse hashCode() ?
  • 39. Collections • E pra que serve esse hashCode() ? – Calma que assim que chegar em coleções falaremos dele ao estudar HashSet, LinkedHashSet, HashMap, LinkedHashMap e Hashtable
  • 40. Collections • E pra que serve esse hashCode() ? – Calma que assim que chegar em coleções falaremos dele ao estudar HashSet, LinkedHashSet, HashMap, LinkedHashMap e Hashtable • Certo mas então o que ele tem a ver com meu teste de igualdade ??
  • 41. Collections • E pra que serve esse hashCode() ? – Calma que assim que chegar em coleções falaremos dele ao estudar HashSet, LinkedHashSet, HashMap, LinkedHashMap e Hashtable • Certo mas então o que ele tem a ver com meu teste de igualdade ?? – As definições do contrato de hashCode() o ligam diretamente ao teste de igualdade, portanto sempre que sobrescrever equals(Object o) você terá que sobrescrever também o hashCode()
  • 42. Collections • O contrato do hashCode() diz: – É constante: qualquer chamada a hashCode() deve sempre retornar o mesmo interiro, desde que as propriedade usadas no teste equals(Object o) não sejam alteradas. – É igual para objetos iguais: a.equals(b) == true .:. a.hashCode() == b.hashCode() – Não é necessário ser diferente para objetos diferentes: ou seja, se a.equals(b) == false .:. a.hashCode() == b.hashCode() || hashCode() != b.hashCode()
  • 43. Collections • O contrato do hashCode() diz: – É constante: qualquer chamada a hashCode() deve sempre retornar o mesmo inteiro, desde que as propriedade usadas no teste equals(Object o) não sejam alteradas. – É igual para objetos iguais: a.equals(b) == true .:. a.hashCode() == b.hashCode() – Não é necessário ser diferente para objetos diferentes: ou seja, se a.equals(b) == false .:. a.hashCode() == b.hashCode() || hashCode() != b.hashCode()
  • 44. Collections • O contrato do hashCode() diz: – É constante: qualquer chamada a hashCode() deve sempre retornar o mesmo inteiro, desde que as propriedade usadas no teste equals(Object o) não sejam alteradas. – É igual para objetos iguais: a.equals(b) == true .:. a.hashCode() == b.hashCode() – Não é necessário ser diferente para objetos diferentes: ou seja, se a.equals(b) == false .:. a.hashCode() == b.hashCode() || hashCode() != b.hashCode()
  • 45. Collections • O contrato do hashCode() diz: – É constante: qualquer chamada a hashCode() deve sempre retornar o mesmo inteiro, desde que as propriedade usadas no teste equals(Object o) não sejam alteradas. – É igual para objetos iguais: a.equals(b) == true .:. a.hashCode() == b.hashCode() – Não é necessário ser diferente para objetos diferentes: ou seja, se a.equals(b) == false .:. a.hashCode() == b.hashCode() || hashCode() != b.hashCode()
  • 46. Collections • Por padrão o método hashCode() é diferente para cada instancia de Object. • Não é implementado em java e sim com linguagem nativa: public class Object { //.. public native int hashCode(); //… }
  • 47. Collections • Por padrão o método hashCode() é diferente para cada instancia de Object. • Não é implementado em java e sim com linguagem nativa: public class Object { //.. public native int hashCode(); //… }
  • 48. Collections • Portanto no nosso modelo dois objetos Pessoa com o mesmo cpf, vai retornar hashCode diferentes (pois esse é o padrão do hashCode) • Isto fere o contrato de hashCode, pois: pessoa1.equals(pessoa2) == true pessoa1.hashCode() != pessoa2.hashCode()
  • 49. Collections • Portanto no nosso modelo dois objetos Pessoa com o mesmo cpf, vai retornar hashCode diferentes (pois esse é o padrão do hashCode) • Isto fere o contrato de hashCode, pois: pessoa1.equals(pessoa2) == true pessoa1.hashCode() != pessoa2.hashCode()
  • 50. Collections Pessoa p1 = new Pessoa("123.456.789-00"); //igual a p2 String text = "São iguais? %b ... hashCodes? %d , %d n"; for (int i = 0; i < 30; i++) { Pessoa p2 = new Pessoa("123.456.789-00"); //igual a p1 System.out.printf( text, p1.equals(p2), p1.hashCode(), p2.hashCode() ); } • O output disso é algo como: – São iguais? true ... hashCodes? 11394033 , 4384790 – São iguais? true ... hashCodes? 11394033 , 24355087 – São iguais? true ... hashCodes? 11394033 , 5442986 – São iguais? true ... hashCodes? 11394033 , 10891203 – São iguais? true ... hashCodes? 11394033 , 9023134 – ....... etc
  • 51. Collections • Portanto para nossa classe Pessoa um hashCode() valido pode ser: public class Pessoa { private String cpf; //... @Override public int hashCode() { return (cpf == null) ? 0 : cpf.hashCode(); } //... }
  • 52. Collections • Portanto para nossa classe Pessoa um hashCode() valido pode ser: public class Pessoa { private String cpf; //... @Override // não é necessário mas é bom public int hashCode() { return (cpf == null) ? 0 : cpf.hashCode(); } //... }
  • 53. Collections • Portanto para nossa classe Pessoa um hashCode() valido pode ser: public class Pessoa { Eu não poderia retornar private String cpf; sempre o mesmo número? Isso não feriria o contrato! //... @Override public int hashCode() { return (cpf == null) ? 0 : cpf.hashCode(); 12; } //... }
  • 54. Collections • Portanto para nossa classe Pessoa um hashCode() valido pode ser: public class Pessoa { Eu não poderia retornar private String cpf; sempre o mesmo número? Isso não feriria o contrato! //... @Override public int hashCode() { SIM! Poderia... return (cpf == null) ? 0 : cpf.hashCode();nem um 12; Porem não é pouco eficiente, como } veremos mais adiante //... quando estudarmos as coleções que usam hash }
  • 55. Collections • Vamos ao que interesssa...
  • 56. Collections • Java Collections Framework (JCF) – Existem duas interfaces principais são elas: • java.util.Collection: uma coleção de objetos • java.util.Map: uma coleção de chave objeto – Toda a estrutura da JCF é baseada e descendem da estrutura destas duas interfaces
  • 57. Collections • Java Collections Framework (JCF) – Existem duas interfaces principais são elas: • java.util.Collection: uma coleção de objetos • java.util.Map: uma coleção de chave objeto – Toda a estrutura da JCF é baseada e descendem da estrutura destas duas interfaces • Então como seria esta estrutura ??
  • 59. Collections • E eu preciso saber de tudo isso ????
  • 60. Collections • E eu preciso saber de tudo isso ???? – SIM!!!!
  • 61. Collections • E eu preciso saber de tudo isso ???? – SIM!!!! Para a certificação e para a vida de programador java!
  • 62. Collections • E eu preciso saber de tudo isso ???? – SIM!!!! Para a certificação e para a vida de programador java! • Mas... devagar com andor que o santo é de barro... • Quais são as interfaces mesmo ??
  • 64. Collections • Interfaces da JFC • Ta bagunçado né ?? Vamos olhar isso direito, começando pela Collection!
  • 65. Collections • Métodos de java.util.Collection<E>: boolean add(E e) boolean addAll(Collection<? extends E> c) boolean contains(Object o) boolean containsAll(Collection<?> c) boolean remove(Object o) boolean removeAll(Collection<?> c) boolean retainAll(Collection<?> c) void clear() int size() boolean isEmpty() Object[] toArray() <T> T[] toArray(T[] a)
  • 66. Collections • Métodos de java.util.Collection<E>: boolean add(E e) boolean addAll(Collection<? extends E> c) boolean contains(Object o) boolean containsAll(Collection<?> c) PERAI PERAI!! boolean remove(Object o) O que é esse <E> ? boolean removeAll(Collection<?> c) e esse add(E e) ? e esse <? extends E> ? boolean retainAll(Collection<?> c) e esse <?> void clear() e aquele <T> T[] ??? int size() boolean isEmpty() Que classes são essas ? Object[] toArray() T e E ??? <T> T[] toArray(T[] a)
  • 67. Collections • Métodos de java.util.Collection<E>: boolean add(E e) boolean addAll(Collection<? extends E> c) boolean contains(Object o) boolean containsAll(Collection<?> c) PERAI PERAI!! boolean remove(Object o) O que é esse <E> ? boolean removeAll(Collection<?> c) e esse add(E e) ? e esse <? extends E> ? boolean retainAll(Collection<?> c) e esse <?> void clear() Isso se chama genéricos! e aquele <T> T[] ??? int size() Eu vou dar uma breve boolean isEmpty() explicação apenas introdutória, e voltamos Que classes são essas ? Object[] toArray() para as Collections T e E ??? <T> T[] toArray(T[] a)
  • 68. Collections • O que são genéricos ? – Os genéricos são amarrações que só existem em tempo de compilação – Existem classes genéricas e métodos genéricos • Para Collection vamos focar em classes genéricas, por exemplo: public class ArrayList<E> ... { boolean add(E e) { ... } }
  • 69. Collections • O que são genéricos ? – Os genéricos são amarrações que só existem em tempo de compilação – Existem classes genéricas e métodos genéricos • Para Collection vamos focar em classes genéricas, por exemplo: public class ArrayList<E> ... { boolean add(E e) { ... } }
  • 70. Collections • O que são genéricos ? – Os genéricos são amarrações que só existem em tempo de compilação – Existem classes genéricas e métodos genéricos • Para Collection vamos focar em classes genéricas... por exemplo: public class ArrayList<E> ... { boolean add(E e) { ... } }
  • 71. Collections • O que são genéricos ? – Os genéricos são amarrações que só existem em tempo de compilação – Existem classes genéricas e métodos genéricos • Para Collection vamos focar em classes genéricas... por exemplo: public class ArrayList<E> ... { boolean add(E e) { ... } }
  • 72. Collections • O que acontece quando declaramos assim? ArrayList<String> strings = new ArrayList<String>(); • Para o compilador, e apenas para o compilador Todos os “T” viram “String” boolean add(String e); • Porem para o bytecode o “T” é sempre Object, ou seja, depois que ta rodando o programa isso some e tudo vira Object novamente boolean add(Object e);
  • 73. Collections • O que acontece quando declaramos assim? ArrayList<String> strings = new ArrayList<String>(); • Para o compilador, e apenas para o compilador Todos os “T” viram “String” boolean add(String e); • Porem para o bytecode o “T” é sempre Object, ou seja, depois que ta rodando o programa isso some e tudo vira Object novamente boolean add(Object e);
  • 74. Collections • O que acontece quando declaramos assim? ArrayList<String> strings = new ArrayList<String>(); • Para o compilador, e apenas para o compilador Todos os “T” viram “String” boolean add(String e); • Porem para o bytecode o “T” é sempre Object, ou seja, depois que ta rodando o programa isso some e tudo vira Object novamente boolean add(Object e);
  • 75. Collections • E podemos criar a classe assim ?? ArrayList c = new ArrayList();
  • 76. Collections • E podemos criar a classe assim ?? ArrayList c = new ArrayList(); SIM!!! podemos!!! E o método gerado fica assim boolean add(Object e);
  • 77. Collections • E podemos criar a classe assim ?? ArrayList c = new ArrayList(); SIM!!! podemos!!! E o método gerado fica assim boolean add(Object e); • E na realidade a classe continua sendo desta forma, os tipos são apenas uma amarração para forçar a codar corretamente uma classe genérica.
  • 78. Collections • O problema esta quando você mistura genérico e não genérico: ArrayList<String> strings = new ArrayList<String>(); ArrayList c = new ArrayList();
  • 79. Collections • O problema esta quando você mistura genérico e não genérico: ArrayList<String> strings = new ArrayList<String>(); ArrayList c = new ArrayList(); • strings.add(a) só aceita Strings como argumento. • c.add(a) aceita qualquer Object • Por exemplo .... =>
  • 80. Collections • O problema esta quando você mistura genérico e não genérico: ArrayList<String> strings = new ArrayList<String>(); ArrayList c = new ArrayList(); c.add(new Object()); strings.add(new Object()); strings.add(“abc”);
  • 81. Collections • O problema esta quando você mistura genérico e não genérico: ArrayList<String> strings = new ArrayList<String>(); ArrayList c = new ArrayList(); c.add(new Object()); // ok vai compilar strings.add(new Object()); strings.add(“abc”);
  • 82. Collections • O problema esta quando você mistura genérico e não genérico: ArrayList<String> strings = new ArrayList<String>(); ArrayList c = new ArrayList(); c.add(new Object()); strings.add(new Object()); // não compila strings.add(“abc”);
  • 83. Collections • O problema esta quando você mistura genérico e não genérico: ArrayList<String> strings = new ArrayList<String>(); ArrayList c = new ArrayList(); c.add(new Object()); strings.add(new Object()); strings.add(“abc”); // ok vai compilar
  • 84. Collections • O problema esta quando você mistura genérico e não genérico: ArrayList<String> strings = new ArrayList<String>(); ArrayList c = new ArrayList(); c.add(new Object()); // ok vai compilar strings.add(new Object()); // não compila strings.add(“abc”); // ok vai compilar
  • 85. Collections • O problema esta quando você mistura genérico e não genérico: ArrayList<String> strings = new ArrayList<String>(); ArrayList c = new ArrayList(); • Mas se você passar strings para c, você terá um problemão
  • 86. Collections • O problema esta quando você mistura genérico e não genérico: ArrayList<String> strings = new ArrayList<String>(); ArrayList c = new ArrayList(); • Mas se você passar strings para c, você terá um problemão c = strings; c.add(new Object()); // compila NÃO gera Exception
  • 87. Collections • O problema esta quando você mistura genérico e não genérico: ArrayList<String> strings = new ArrayList<String>(); ArrayList c = new ArrayList(); • Mas se você passar strings para c, você terá um problemão c = strings; // ok compila MAS É PERIGOSO! c.add(new Object()); // compila NÃO gera Exception
  • 88. Collections • O problema esta quando você mistura genérico e não genérico: ArrayList<String> strings = new ArrayList<String>(); ArrayList c = new ArrayList(); • Mas se você passar strings para c, você terá um problemão c = strings; // ok compila MAS É PERIGOSO! c.add(new Object()); // compila NÃO gera Exception
  • 89. Collections • O problema esta quando você mistura genérico e não genérico: ArrayList<String> strings = new ArrayList<String>(); ArrayList c = new ArrayList(); • Mas se você passar strings para c, você terá um problemão c = strings; // ok compila MAS É PERIGOSO! c.add(new Object()); // compila NÃO gera Exception
  • 90. Collections • O problema esta quando você mistura genérico e não genérico: ArrayList<String> strings = new ArrayList<String>(); ArrayList c = new ArrayList(); • Mas se você passar strings para c, você terá um problemão c = strings; // ok compila MAS É PERIGOSO! c.add(new Object()); // compila NÃO gera Exception
  • 91. Collections • O problema esta quando você mistura genérico e não genérico: Neste momento a collection strings ArrayList<String> strings = new ArrayList<String>(); mesmo passou a conter um Object ArrayList c = new ArrayList(); sua tipagem impedindo isso, a isso pode ocorrer quando generico • Mas se você passar tString para t, você é misturado com não genericos terá um problemão c = strings; // ok compila MAS É PERIGOSO! c.add(new Object()); // compila NÃO gera Exception
  • 92. Collections • A Sun aconselha sempre usar os genéricos: • Os códigos que não usam genérico quando as classes o definem compilam, mas geram warnings avisando que pode dar problema.
  • 93. Collections • Mas perai e aqueles <?> o que é essa “?” – Isso é um operador curinga ela funciona quando você quer falar que aceita uma classe com qualquer tipagem. • Então: Teste<?> tGenerico = new Teste<String>(); É o mesmo que ?? Teste tGenerico = new Teste<String>(); NÃO!! São diferentes!
  • 94. Collections • Mas perai e aqueles <?> o que é essa “?” – Isso é um operador curinga ela funciona quando você quer falar que aceita uma classe com qualquer tipagem. • Então: Teste<?> tGenerico = new Teste<String>(); É o mesmo que ?? Teste tGenerico = new Teste<String>(); NÃO!! São diferentes!
  • 95. Collections • Mas perai e aqueles <?> o que é essa “?” – Isso é um operador curinga ela funciona quando você quer falar que aceita uma classe com qualquer tipagem. • Então: ArrayList<?> c = new ArrayList<String>(); É o mesmo que ?? ArrayList c = new ArrayList<String>(); NÃO!! São diferentes!
  • 96. Collections • Mas perai e aqueles <?> o que é essa “?” – Isso é um operador curinga ela funciona quando você quer falar que aceita uma classe com qualquer tipagem. • Então: ArrayList<?> c = new ArrayList<String>(); É o mesmo que ?? ArrayList c = new ArrayList<String>(); NÃO!! São diferentes!
  • 97. Collections • Quando você usa o operador <?> você não pode mandar objetos para os métodos tipados, por exemplo: c.add(a); // não compila • Todos os outros métodos, que não tem o T, funcionam, portanto deve ser usando quando você quer usar o objeto sem passar objetos tipados, por exemplo: c.size(); // funciona normalmente
  • 98. Collections • Tá ... e porque não compila ?? – O motivo é porque você não sabe que tipo de coleção você esta trabalhando • Por exemplo: List<?> lista; //eu posso adcionar qualquer lista ai lista = new ArrayList<String>(); lista = new ArrayList<Integer>(); lista = new ArrayList<Thread>(); • Então quando você só sabe da list • /
  • 99. Collections • Tá ... e porque não compila ?? – O motivo é porque você não sabe que tipo de coleção você esta trabalhando • Por exemplo: List<?> lista; //eu posso adcionar qualquer lista ai lista = new ArrayList<String>(); lista = new ArrayList<Integer>(); lista = new ArrayList<Thread>(); • Então quando você só sabe da list • /
  • 100. Collections • Tá ... e porque não compila ?? – O motivo é porque você não sabe que tipo de coleção você esta trabalhando • Por exemplo: List<?> lista; //eu posso adcionar qualquer lista ai lista = new ArrayList<String>(); lista = new ArrayList<Integer>(); lista = new ArrayList<Thread>(); • Então quando você só sabe da list • /
  • 101. Collections • Tá ... e porque não compila ?? – O motivo é porque você não sabe que tipo de coleção você esta trabalhando • Por exemplo: List<?> lista; //eu posso adcionar qualquer lista ai lista = new ArrayList<String>(); lista = new ArrayList<Integer>(); lista = new ArrayList<Thread>(); • Então quando você só sabe da list • /
  • 102. Collections • Tá ... e porque não compila ?? – O motivo é porque você não sabe que tipo de coleção você esta trabalhando • Por exemplo: List<?> lista; //eu posso adcionar qualquer lista ai lista = new ArrayList<String>(); lista = new ArrayList<Integer>(); lista = new ArrayList<Thread>(); • Então quando você não sabe o tipo • /
  • 103. Collections • Tá ... e porque não compila ?? – O motivo é porque você não sabe que tipo de coleção você esta trabalhando • Por exemplo: List<?> lista = getList(); • Você não poderá saber o que essa lista aceita: lista.add(“Texto”); //e se for uma lista de Thread ? • Porem você pode usar os métodos não tipados lista.contains(“Texto”); lista.remove(33); lista.size();
  • 104. Collections • Tá ... e porque não compila ?? – O motivo é porque você não sabe que tipo de coleção você esta trabalhando • Por exemplo: List<?> lista = getList(); • Você não poderá saber o que essa lista aceita: lista.add(“Texto”); //e se for uma lista de Thread ? • Porem você pode usar os métodos não tipados lista.contains(“Texto”); lista.remove(33); lista.size();
  • 105. Collections • Tá ... e porque não compila ?? – O motivo é porque você não sabe que tipo de coleção você esta trabalhando • Por exemplo: List<?> lista = getList(); • Você não poderá saber o que essa lista aceita: lista.add(“Texto”); //e se for uma lista de Thread ? • Porem você pode usar os métodos não tipados lista.contains(“Texto”); lista.remove(33); lista.size();
  • 106. Collections • Tá ... e porque não compila ?? – O motivo é porque você não sabe que tipo de coleção você esta trabalhando • Por exemplo: List<?> lista = getList(); • Você não poderá saber o que essa lista aceita: lista.add(“Texto”); //e se for uma lista de Thread ? • Porem você pode usar os métodos não tipados lista.contains(“Texto”); lista.remove(33); lista.size();
  • 107. Collections • Tá ... e porque não compila ?? – O motivo é porque você não sabe que tipo de coleção você esta trabalhando • Por exemplo: List<?> lista = getList(); • Você não poderá saber o que essa lista aceita: lista.add(“Texto”); //e se for uma lista de Thread ? • Porem você pode usar os métodos não tipados lista.contains(“Texto”); Object o = lista.get(4); //n sei o tipo da lista .:. n sei o retorno lista.size();
  • 108. Collections • Tá ... e porque não compila ?? – O motivo é porque você não sabe que tipo de coleção você esta trabalhando • Por exemplo: List<?> lista = getList(); • Você não poderá saber o que essa lista aceita: lista.add(“Texto”); //e se for uma lista de Thread ? • Porem você pode usar os métodos não tipados lista.contains(“Texto”); Object o = lista.get(4); //n sei o tipo da lista .:. n sei o retorno lista.size();
  • 109. Collections • Ta e aquele <? extends T> ?: – Ele funciona como uma sub categoria... por exemplo: ArrayList<Number> numbers = new ArrayList<Number>(); • O método addAll nesse caso fica boolean addAll(Collection<? extends Number> c); • E assim é possivel adcionar a numbers qualquer coleção tipado como Number ou por de suas subclasse. ArrayList<Integer> integers = new ArrayList<Integer>(); integers.add(12); integers.add(15); numbers.addAll(integers); //pois os inteiros também são Number
  • 110. Collections • Ta e aquele <? extends T> ?: – Ele funciona como uma sub categoria... por exemplo: ArrayList<Number> numbers = new ArrayList<Number>(); • O método addAll nesse caso fica boolean addAll(Collection<? extends Number> c); • E assim é possivel adcionar a numbers qualquer coleção tipado como Number ou por de suas subclasse. ArrayList<Integer> integers = new ArrayList<Integer>(); integers.add(12); integers.add(15); numbers.addAll(integers); //pois os inteiros também são Number
  • 111. Collections • Ta e aquele <? extends T> ?: – Ele funciona como uma sub categoria... por exemplo: ArrayList<Number> numbers = new ArrayList<Number>(); • O método addAll nesse caso fica boolean addAll(Collection<? extends Number> c); • E assim é possivel adcionar a numbers qualquer coleção tipado como Number ou por de suas subclasse. ArrayList<Integer> integers = new ArrayList<Integer>(); integers.add(12); integers.add(15); numbers.addAll(integers); //pois os inteiros também são Number
  • 112. Collections • Ta e aquele <? extends T> ?: – Ele funciona como uma sub categoria... por exemplo: ArrayList<Number> numbers = new ArrayList<Number>(); • O método addAll nesse caso fica boolean addAll(Collection<? extends Number> c); • E assim é possivel adcionar a numbers qualquer coleção tipado como Number ou por de suas subclasse. ArrayList<Integer> integers = new ArrayList<Integer>(); integers.add(12); integers.add(15); numbers.addAll(integers); //pois os inteiros também são Number
  • 113. Collections • Ta e aquele <? extends T> ?: – Ele funciona como uma sub categoria... por exemplo: ArrayList<Number> numbers = new ArrayList<Number>(); • O método addAll nesse caso fica boolean addAll(Collection<? extends Number> c); • E assim é possível adicionar a numbers qualquer coleção tipado como Number ou por uma de suas subclasse. ArrayList<Integer> integers = new ArrayList<Integer>(); integers.add(12); integers.add(15); numbers.addAll(integers); //pois os inteiros também são Number
  • 114. Collections • Ta e aquele <? extends T> ?: – Ele funciona como uma sub categoria... por exemplo: ArrayList<Number> numbers = new ArrayList<Number>(); • O método addAll nesse caso fica boolean addAll(Collection<? extends Number> c); • E assim é possível adicionar a numbers qualquer coleção tipado como Number ou por uma de suas subclasse. ArrayList<Integer> integers = new ArrayList<Integer>(); integers.add(12); integers.add(15); numbers.addAll(integers); //pois os inteiros também são Number
  • 115. Collections Espera um pouco! • Ta e aquele <? extends T> ?: É realmente necessário isso ?? – Ele funciona como uma sub categoria... por exemplo: E se eu fizesse assim? ArrayList<Number> numbers = new ArrayList<Number>(); • O método addAll nesse caso fica boolean addAll(Collection<? extends Number> c); • E assim é possível adicionar a numbers qualquer coleção tipado como Number ou por uma de suas subclasse. ArrayList<Integer> integers = new ArrayList<Integer>(); integers.add(12); integers.add(15); numbers.addAll(integers); //pois os inteiros também são Number
  • 116. Collections Espera um pouco! • Ta e aquele <? extends T> ?: É realmente necessário isso ?? – Ele funciona como uma sub categoria... por exemplo: E se eu fizesse assim? ArrayList<Number> numbers = new ArrayList<Number>(); • O método addAll nesse caso fica boolean addAll(Collection<? extends Number> c); • E assim é possível adicionar a numbers qualquer coleção tipado como Number ou por uma de SIM!!! Ésubclasse. suas SIM! ArrayList<Integer> integers = new ArrayList<Integer>(); Isso não será como você integers.add(12); integers.add(15); Espera, deixa eu explicar numbers.addAll(integers); //pois os inteiros também são Number melhor
  • 117. Collections Espera um pouco! • Ta e aquele <? extends T> ?: É realmente necessário isso ?? – Ele funciona como uma sub categoria... por exemplo: E se eu fizer assim? ArrayList<Number> numbers = new ArrayList<Number>(); • O método addAll nesse caso fica boolean addAll(Collection<? extends Number> c); • E assim é possível adicionar a numbers (Collection<Number> c) qualquer coleção tipado como Number ou por uma de SIM!!! Ésubclasse. suas SIM! ArrayList<Integer> integers = new ArrayList<Integer>(); Isso não será como você integers.add(12); integers.add(15); Espera, deixa eu explicar numbers.addAll(integers); //pois os inteiros também são Number melhor
  • 118. Collections Espera um pouco! • Ta e aquele <? extends T> ?: É realmente necessário isso ?? – Ele funciona como uma sub categoria... por exemplo: E se eu fizer assim? ArrayList<Number> numbers = new ArrayList<Number>(); • O método addAll nesse caso fica boolean addAll(Collection<? extends Number> c); • E assim é possível adicionar a numbers (Collection<Number> c) qualquer coleção tipado como Number ou por uma de SIM!!! Ésubclasse. suas SIM! ArrayList<Integer> integers = new ArrayList<Integer>(); Isso não será como você integers.add(12); integers.add(15); espera, deixa eu explicar numbers.addAll(integers); //pois os inteiros também são Number melhor
  • 119. Collections ArrayList<Number> list; • Isso quer dizer que list só pode receber o tipo Number... por exemplo: list = new ArrayList<Integer>(); //NÃO compila list = new ArrayList<Number>(); //compila • Para ser qualquer sub-tipo de number é preciso fazer ArrayList<? extends Number> list; list = new ArrayList<Integer>(); //agora compila • E qual o retorno para list.get(0) ?? Number n = list.get(0); //O retorno é um Number!
  • 120. Collections ArrayList<Number> list; • Isso quer dizer que list só pode receber o tipo Number... por exemplo: list = new ArrayList<Integer>(); // NÃO compila list = new ArrayList<Number>(); // compila • Para ser qualquer sub-tipo de number é preciso fazer ArrayList<? extends Number> list; list = new ArrayList<Integer>(); //agora compila • E qual o retorno para list.get(0) ?? Number n = list.get(0); //O retorno é um Number!
  • 121. Collections ArrayList<Number> list; • Isso quer dizer que list só pode receber o tipo Number... por exemplo: list = new ArrayList<Integer>(); // NÃO compila list = new ArrayList<Number>(); // compila • Para ser qualquer sub-tipo de Number é preciso fazer ArrayList<? extends Number> list; list = new ArrayList<Integer>(); //agora compila • E qual o retorno para list.get(0) ?? Number n = list.get(0); //O retorno é um Number!
  • 122. Collections ArrayList<Number> list; • Isso quer dizer que list só pode receber o tipo Number... por exemplo: list = new ArrayList<Integer>(); // NÃO compila list = new ArrayList<Number>(); // compila • Para ser qualquer sub-tipo de Number é preciso fazer ArrayList<? extends Number> list; list = new ArrayList<Integer>(); //agora compila • E qual o retorno para list.get(0) ?? Number n = list.get(0); //O retorno é um Number!
  • 123. Collections • Ta e aquele <T> T[] toArray(T[] a)?:
  • 124. Collections • Ta e aquele <T> T[] toArray(T[] a)?: – Esse é um método generico, e não usa tipagem da classe mas sim do método
  • 125. Collections • Ta e aquele <T> T[] toArray(T[] a)?: – Esse é um método generico, e não usa tipagem da classe mas sim do método • Este método quer dizer que o retorno dele é uma array do tipo “T” que é o mesmo tipo da array enviada no argumento, portanto nums.toArray(new Number[]) nums.toArray(new Integer[])
  • 126. Collections • Ta e aquele <T> T[] toArray(T[] a)?: – Esse é um método generico, e não usa tipagem da classe mas sim do método • Este método quer dizer que o retorno dele é uma array do tipo “T” que é o mesmo tipo da array enviada no argumento, portanto nums.toArray(new Number[]) // retorna um Number[] nums.toArray(new Integer[])
  • 127. Collections • Ta e aquele <T> T[] toArray(T[] a)?: – Esse é um método generico, e não usa tipagem da classe mas sim do método • Este método quer dizer que o retorno dele é uma array do tipo “T” que é o mesmo tipo da array enviada no argumento, portanto nums.toArray(new Number[]) nums.toArray(new Integer[]) // retorna um Integer[]
  • 128. Collections • Tem mais coisas que preciso saber sobre Genéricos pra prova ou para usar collection??
  • 129. Collections • Tem mais coisas que preciso saber sobre Genéricos pra prova ou para usar collection?? – SIM! Tem, é só mais uma coisa, que eu vou explicar depois!
  • 130. Collections • Tem mais coisas que preciso saber sobre Genéricos pra prova ou para usar collection?? – SIM! Tem, é só mais uma coisa, que eu vou explicar depois! • Mas vamos voltar para collections se não agente não acaba!
  • 132. Collections • A java.util.Collection: – Collection é um contrato de interface que representa uma coleção de objetos – Pode-se dizer que uma coleção é uma versão turbinada de array, com mais funcionalidades e mais segurança.
  • 133. Collections • Métodos java.util.Collection<E> extends Iterable<E>: boolean add(E e) boolean addAll(Collection<? extends E> c) boolean remove(Object o) boolean removeAll(Collection<?> c) boolean retainAll(Collection<?> c) void clear() boolean contains(Object o) boolean containsAll(Collection<?> c) int size() boolean isEmpty() Object[] toArray() <T> T[] toArray(T[] a) Iterator<E> iterator() //método de Iterable
  • 134. Collections • java.util.Collection<E> extends Iterable<E>: boolean add(E e) boolean addAll(Collection<? extends E> c) boolean remove(Object o) boolean removeAll(Collection<?> c) boolean retainAll(Collection<?> c) void clear() Opcional boolean contains(Object o) boolean containsAll(Collection<?> c) int size() boolean isEmpty() Object[] toArray() <T> T[] toArray(T[] a) Iterator<E> iterator()
  • 135. Collections • java.util.Collection<E> extends Iterable<E>: boolean add(E e) boolean addAll(Collection<? extends E> c) COMO ASSIM OPCIONAL? boolean remove(Object o) boolean removeAll(Collection<?> c) boolean retainAll(Collection<?> c) void clear() Opcional boolean contains(Object o) boolean containsAll(Collection<?> c) int size() boolean isEmpty() Object[] toArray() <T> T[] toArray(T[] a) Iterator<E> iterator()
  • 136. Collections • java.util.Collection<E> extends Iterable<E>: boolean add(E e) boolean addAll(Collection<? extends E> c) COMO ASSIM OPCIONAL? boolean remove(Object o) boolean removeAll(Collection<?> c) A interface pede o método, como vocês podem ver, boolean retainAll(Collection<?> c) porém na implementação void clear() Opcional pode-se lançar a exceção UnsupportedOperationException boolean contains(Object o) E isso é utilizado em boolean containsAll(Collection<?> c) Implementações somente leitura Implementações boca de lobo int size() ou outros tipos. boolean isEmpty() Object[] toArray() <T> T[] toArray(T[] a) Iterator<E> iterator()
  • 137. Collections • java.util.Collection<E> extends Iterable<E>: boolean add(E e) boolean addAll(Collection<? extends E> c) boolean remove(Object o) boolean removeAll(Collection<?> c) boolean retainAll(Collection<?> c) void clear() boolean contains(Object o) boolean containsAll(Collection<?> c) int size() Vamos conhecer os métodos! boolean isEmpty() Object[] toArray() <T> T[] toArray(T[] a) Iterator<E> iterator()
  • 138. Collections • java.util.Collection<E> extends Iterable<E>: boolean add(E e) boolean addAll(Collection<? extends E> c) boolean remove(Object o) boolean removeAll(Collection<?> c) Adiciona um elemento a boolean retainAll(Collection<?> c) coleção, onde este elemento void clear() deve ser do mesmo tipo <E> boolean contains(Object o) da coleção, ou de um sub-tipo. boolean containsAll(Collection<?> c) Retorna verdadeiro se houver int size() modificação na coleção, ou boolean isEmpty() seja se o elemento for adicionado. Object[] toArray() <T> T[] toArray(T[] a) Implementação é opcional Iterator<E> iterator()
  • 139. Collections • java.util.Collection<E> extends Iterable<E>: boolean add(E e) boolean addAll(Collection<? extends E> c) boolean remove(Object o) boolean removeAll(Collection<?> c) Adiciona uma coleção de boolean retainAll(Collection<?> c) elementos do mesmo tipo <E> void clear() ou uma coleção de sub-tipos boolean contains(Object o) de <E>. boolean containsAll(Collection<?> c) Retorna verdadeiro se pelo int size() menos um elemento for boolean isEmpty() adicionado a coleção, ou seja, se a coleção foi modificada. Object[] toArray() <T> T[] toArray(T[] a) Implementação é opcional Iterator<E> iterator()
  • 140. Collections • java.util.Collection<E> extends Iterable<E>: boolean add(E e) boolean addAll(Collection<? extends E> c) boolean remove(Object o) boolean removeAll(Collection<?> c) Remove da coleção a primeira boolean retainAll(Collection<?> c) ocorrência de um objeto void clear() significantemente igual ao boolean contains(Object o) enviado. boolean containsAll(Collection<?> c) Retorna verdadeiro caso o int size() objeto existia na coleção, ou boolean isEmpty() seja, se a coleção foi modificada. Object[] toArray() <T> T[] toArray(T[] a) Implementação é opcional. Iterator<E> iterator()
  • 141. Collections • java.util.Collection<E> extends Iterable<E>: boolean add(E e) boolean addAll(Collection<? extends E> c) boolean remove(Object o) boolean removeAll(Collection<?> c) Remove todas da as boolean retainAll(Collection<?> c) ocorrências desta coleção dos void clear() elementos contidos na coleção boolean contains(Object o) c enviada. boolean containsAll(Collection<?> c) Após esta operação nenhum int size() elemento desta coleção boolean isEmpty() retornará true para c.contains() Retorna verdadeiro se pelo Object[] toArray() menos um elemento foi <T> T[] toArray(T[] a) removido, ou seja, se a Iterator<E> iterator() coleção foi modificada. Implementação é opcional.
  • 142. Collections • java.util.Collection<E> extends Iterable<E>: boolean add(E e) boolean addAll(Collection<? extends E> c) boolean remove(Object o) boolean removeAll(Collection<?> c) Faz o processo inverso de boolean retainAll(Collection<?> c) removeAll. void clear() Retém nesta coleção apénas boolean contains(Object o) os elementos que também boolean containsAll(Collection<?> c) estejam continos na coleção c. int size() Após esta operação todos os boolean isEmpty() elementos desta coleção retornarão true para Object[] toArray() c.contains(). <T> T[] toArray(T[] a) Retorna verdadeiro se a Iterator<E> iterator() coleção for modificada. Implementação é opcional
  • 143. Collections • java.util.Collection<E> extends Iterable<E>: boolean add(E e) boolean addAll(Collection<? extends E> c) boolean remove(Object o) boolean removeAll(Collection<?> c) Remove todos os elementos boolean retainAll(Collection<?> c) da coleção void clear() boolean contains(Object o) Implementação é opcional. boolean containsAll(Collection<?> c) int size() boolean isEmpty() Object[] toArray() <T> T[] toArray(T[] a) Iterator<E> iterator()
  • 144. Collections • java.util.Collection<E> extends Iterable<E>: boolean add(E e) boolean addAll(Collection<? extends E> c) boolean remove(Object o) boolean removeAll(Collection<?> c) Verifica se existe nesta coleção boolean retainAll(Collection<?> c) um objeto significantemente void clear() igual ao objeto o enviado. boolean contains(Object o) boolean containsAll(Collection<?> c) int size() boolean isEmpty() Object[] toArray() <T> T[] toArray(T[] a) Iterator<E> iterator()
  • 145. Collections • java.util.Collection<E> extends Iterable<E>: boolean add(E e) boolean addAll(Collection<? extends E> c) boolean remove(Object o) boolean removeAll(Collection<?> c) Verifica se todos os objetos da boolean retainAll(Collection<?> c) coleção c enviada, estão void clear() contidos nesta coleção. boolean contains(Object o) Só retorna verdade se boolean containsAll(Collection<?> c) this.contains(elementoDeC) for int size() verdade para cada elemento boolean isEmpty() de c. Object[] toArray() <T> T[] toArray(T[] a) Iterator<E> iterator()
  • 146. Collections • java.util.Collection<E> extends Iterable<E>: boolean add(E e) boolean addAll(Collection<? extends E> c) boolean remove(Object o) boolean removeAll(Collection<?> c) Informa a quantidade de boolean retainAll(Collection<?> c) objetos contidos na coleção. void clear() Obs.: Se a coleção contiver boolean contains(Object o) objetos nulos eles também boolean containsAll(Collection<?> c) serão contabilizados int size() boolean isEmpty() Sim! Existem coleções que aceitam elementos nulos. Object[] toArray() <T> T[] toArray(T[] a) Iterator<E> iterator()
  • 147. Collections • java.util.Collection<E> extends Iterable<E>: boolean add(E e) boolean addAll(Collection<? extends E> c) boolean remove(Object o) boolean removeAll(Collection<?> c) Método de comodidade, o boolean retainAll(Collection<?> c) mesmo que testar se: void clear() size() == 0 boolean contains(Object o) Retorna verdadeiro se não boolean containsAll(Collection<?> c) houver elementos nesta int size() coleção. boolean isEmpty() Object[] toArray() <T> T[] toArray(T[] a) Iterator<E> iterator()
  • 148. Collections • java.util.Collection<E> extends Iterable<E>: boolean add(E e) boolean addAll(Collection<? extends E> c) boolean remove(Object o) boolean removeAll(Collection<?> c) Retorna uma array contendo boolean retainAll(Collection<?> c) cada um dos elementos desta void clear() coleção, na mesma ordem em boolean contains(Object o) que os elementos aparecem boolean containsAll(Collection<?> c) no iterator(). int size() Não é a array mantida pela boolean isEmpty() lista (caso assim seja implementada) é uma cópia Object[] toArray() dela. <T> T[] toArray(T[] a) Alterações nesta array não são Iterator<E> iterator() refletidas na coleção.
  • 149. Collections • java.util.Collection<E> extends Iterable<E>: boolean add(E e) boolean addAll(Collection<? extends E> c) boolean remove(Object o) boolean removeAll(Collection<?> c) Retorna todos os elementos da boolean retainAll(Collection<?> c) coleção em uma array do void clear() mesmo tipo da enviada. boolean contains(Object o) if (a.length >= this.size()) { boolean containsAll(Collection<?> c) Então os elementos serão int size() colocados dentro da própria boolean isEmpty() array enviada e os elementos que sobrarem serão setados Object[] toArray() null. <T> T[] toArray(T[] a) } else { Iterator<E> iterator() cria uma nova array do mesmo tipo da enviada e a retorna.
  • 150. Collections • java.util.Collection<E> extends Iterable<E>: boolean add(E e) boolean addAll(Collection<? extends E> c) boolean remove(Object o) boolean removeAll(Collection<?> c) Cria um Iterator que é usado boolean retainAll(Collection<?> c) para navegar sobre os void clear() elementos desta coleção boolean contains(Object o) public interface Iterator<E> { boolean containsAll(Collection<?> c) boolean hasNext(); int size() E next(); boolean isEmpty() void remove(); //opicional } Object[] toArray() * Este método é parte da <T> T[] toArray(T[] a) interface Iterable<E> e toda Iterator<E> iterator() //* classe que a implementa pode ser usada em um for-each
  • 151. Collections • java.util.Collection<E>: – Não há restrição, ordem ou classificação definida no contrato de Collection
  • 152. Collections • java.util.Collection<E>: – Não há restrição, ordem ou classificação definida no contrato de Collection – A coleção de objetos pode conter qualquer tipo de objeto, em qualquer quantidade, sejam eles repetidos ou não, sem qualquer ordem ou classificação definida.
  • 153. Collections • java.util.Collection<E>: – Não há restrição, ordem ou classificação definida no contrato de Collection – A coleção de objetos pode conter qualquer tipo de objeto, em qualquer quantidade, sejam eles repetidos ou não, sem qualquer ordem ou classificação definida. – Esta é a forma mais genérica de agrupar objetos
  • 154. Collections • Tá! e se eu quiser uma coleção sem deixar que os objetos se repitam ??
  • 155. Collections • Tá! e se eu quiser uma coleção sem deixar que os objetos se repitam ?? – Então você quer um java.util.Set uma sub- interface de Collection
  • 156. Collections • java.util.Set<E> extends Collection<E>: – Um Set tem exatamente a mesma interface de Collection, a única mudança é na descrição de seus métodos. – O Set não aceita elementos repetidos – Ao usar add(obj) onde o Set já contem obj, ele simplesmente não o adiciona e retorna false. – A não implementação de equals(Object o) ou a implementação incorreta pode causar efeitos indesejáveis e bug de difícil detectação.
  • 157. Collections • java.util.Set<E> extends Collection<E>: – Um Set tem exatamente a mesma interface de Collection, a única mudança é na descrição de seus métodos. – O Set não aceita elementos repetidos – Ao usar add(obj) onde o Set já contem obj, ele simplesmente não o adiciona e retorna false. – A não implementação de equals(Object o) ou a implementação incorreta pode causar efeitos indesejáveis e bug de difícil detectação.
  • 158. Collections • java.util.Set<E> extends Collection<E>: – Um Set tem exatamente a mesma interface de Collection, a única mudança é na descrição de seus métodos. – O Set não aceita elementos repetidos – Ao usar add(obj) onde o Set já contem obj, ele simplesmente não o adiciona e retorna false. – A não implementação de equals(Object o) ou a implementação incorreta pode causar efeitos indesejáveis e bug de difícil detectação.
  • 159. Collections • java.util.Set<E> extends Collection<E>: – Assim como a Collection, não há restrição, ordem ou classificação definida no contrato de Set – A coleção de objetos pode conter qualquer tipo de objeto, em qualquer quantidade, sem qualquer ordem ou classificação definida, porem nunca objetos repetidos! – Este é o diferencial de um Set para uma Collection, não há objetos significantemente repetidos, isso quer dizer onde equals(other) retorne true para outro elemento dentro do mesmo Set.
  • 160. Collections • java.util.Set<E> extends Collection<E>: – Assim como a Collection, não há restrição, ordem ou classificação definida no contrato de Set – A coleção de objetos pode conter qualquer tipo de objeto, em qualquer quantidade, sem qualquer ordem ou classificação definida, porem nunca objetos repetidos! – Este é o diferencial de um Set para uma Collection, não há objetos significantemente repetidos, isso quer dizer onde equals(other) retorne true para outro elemento dentro do mesmo Set.
  • 161. Collections • java.util.Set<E> extends Collection<E>: – Assim como a Collection, não há restrição, ordem ou classificação definida no contrato de Set – A coleção de objetos pode conter qualquer tipo de objeto, em qualquer quantidade, sem qualquer ordem ou classificação definida, porem nunca objetos repetidos! – Este é o diferencial de um Set para uma Collection, não há objetos significantemente repetidos, isso quer dizer onde equals(other) retorne true para outro elemento dentro do mesmo Set.
  • 162. Collections • É possível também utilizar os conceitos de fila com a Java Collections Framework – Através da interface java.util.Queue<E>
  • 163. Collections • java.util.Queue<E> extends Collection<E>: – Assim como a Collection, não há restrição, ordem ou classificação definida no contrato da fila Queue – Há apenas disponibilizado uma interface de fila, sem especificar quais condições. – As suas implementações que vão definir se a Queue é uma FIFO, FILO ou o quer que seja.
  • 164. Collections • java.util.Queue<E> extends Collection<E>: – Assim como a Collection, não há restrição, ordem ou classificação definida no contrato da fila Queue – Há apenas disponibilizado uma interface de fila, sem especificar quais condições. – As suas implementações que vão definir se a Queue é uma FIFO, FILO ou o quer que seja.
  • 165. Collections • java.util.Queue<E> extends Collection<E>: – Assim como a Collection, não há restrição, ordem ou classificação definida no contrato da fila Queue – Há apenas disponibilizado uma interface de fila, sem especificar quais condições. – As suas implementações que vão definir se a Queue é uma FIFO, FILO ou o quer que seja.
  • 166. Collections • java.util.Queue<E> extends Collection<E>: boolean add(E e) //adciona um elemento a fila se houver capacidade, //lança uma IllegalStateException se não houver. boolean offer(E e) //adciona um elemento a fila se houver capacidade, //retorna false (sem lança exceção) se não houver. E element() //retorna, mas não remove o elemento do topo da fila //lança uma exceção se não houver mais elementos E peek() //retorna, mas não remove o elemento do topo da fila //retorna null se não houver elementos. E remove() //retorna e remove o elemento do topo da fila //lança uma exceção se não houver mais elementos. E poll() //retorna e remove o elemento do topo da fila //retorna null se não houver elementos.
  • 167. Collections • java.util.Queue<E> extends Collection<E>: boolean add(E e) //adiciona um elemento a fila se houver capacidade, // se não houver lança uma IllegalStateException. boolean offer(E e) //adiciona um elemento a fila se houver capacidade, // se não houver retorna false (sem lança exceção). E element() //retorna, mas não remove o elemento do topo da fila //lança uma exceção se não houver mais elementos. E peek() //retorna, mas não remove o elemento do topo da fila //retorna null se não houver elementos. E remove() //retorna e remove o elemento do topo da fila //lança uma exceção se não houver mais elementos. E poll() //retorna e remove o elemento do topo da fila //retorna null se não houver elementos.
  • 168. Collections • java.util.Queue<E> extends Collection<E>: boolean add(E e) //adiciona um elemento a fila se houver capacidade, // se não houver lança uma IllegalStateException. boolean offer(E e) //adiciona um elemento a fila se houver capacidade, // se não houver retorna false (sem lança exceção). E element() //retorna, mas não remove o elemento do topo da fila //não havendo + elementos lança NoSuchElementException. E peek() //retorna, mas não remove o elemento do topo da fila //retorna null se não houver elementos. E remove() //retorna e remove o elemento do topo da fila //lança uma exceção se não houver mais elementos. E poll() //retorna e remove o elemento do topo da fila //retorna null se não houver elementos.
  • 169. Collections • java.util.Queue<E> extends Collection<E>: boolean add(E e) //adiciona um elemento a fila se houver capacidade, // se não houver lança uma IllegalStateException. boolean offer(E e) //adiciona um elemento a fila se houver capacidade, // se não houver retorna false (sem lança exceção). E element() //retorna, mas não remove o elemento do topo da fila //não havendo + elementos lança NoSuchElementException. E peek() //retorna, mas não remove o elemento do topo da fila //retorna null se não houver elementos. E remove() //retorna e remove o elemento do topo da fila //não havendo + elementos lança NoSuchElementException. E poll() //retorna e remove o elemento do topo da fila //retorna null se não houver elementos.
  • 170. Collections • Mas e como eu consigo verificar o elemento 4 que esta dentro de uma Collection, Queue ou Set? só da usando o iterator() ? – Sim infelizmente sim, a única forma de verificar os elementos destas duas interfaces é percorrendo a coleção toda! • Putz! E aquele papo de que era uma array turbinada?? Não tem índice ? – Para tudo na vida tem uma solução, o que você quer é uma java.util.List
  • 171. Collections • Mas e como eu consigo verificar o elemento 4 que esta dentro de uma Collection, Queue ou Set? só da usando o iterator() ? – Sim infelizmente sim, a única forma de verificar os elementos destas interfaces é percorrendo a coleção toda! • Putz! E aquele papo de que era uma array turbinada?? Não tem índice ? – Para tudo na vida tem uma solução, o que você quer é uma java.util.List
  • 172. Collections • Mas e como eu consigo verificar o elemento 4 que esta dentro de uma Collection, Queue ou Set? só da usando o iterator() ? – Sim infelizmente sim, a única forma de verificar os elementos destas interfaces é percorrendo a coleção toda! • Putz! E aquele papo de que era uma array turbinada?? Não tem índice ? cadê o get(3) ? – Para tudo na vida tem uma solução, o que você quer é uma java.util.List
  • 173. Collections • Mas e como eu consigo verificar o elemento 4 que esta dentro de uma Collection, Queue ou Set? só da usando o iterator() ? – Sim infelizmente sim, a única forma de verificar os elementos destas interfaces é percorrendo a coleção toda! • Putz! E aquele papo de que era uma array turbinada?? Não tem índice ? cadê o get(3) ? – Para tudo na vida tem uma solução, o que você quer é uma java.util.List<E>
  • 174. Collections • java.util.List<E> extends Collection<E>: – Uma List é uma coleção ordenada (não classificada), muito parecida com arrays, porem com bem mais funcionalidades e sem limite de tamanho. – Os métodos add() e addAll() da interface Collection adicionam itens ao final da List. – Assim como as Collection todos os métodos de adição e remoção são opcionais e podem lançar UnsupportedOperationException – As mudanças principais em relação a Collection é que tem seus itens ordenado. Os itens da List são ordenados em índice que vão de 0 a (size() -1), conformes veremos a seguir, e usar índice fora desse range gera IndexOutOfBoundsException.
  • 175. Collections • java.util.List<E> extends Collection<E>: – Uma List é uma coleção ordenada (não classificada), muito parecida com arrays, porem com bem mais funcionalidades e sem limite de tamanho. – Os métodos add() e addAll() da interface Collection adicionam itens ao final da List. – Assim como as Collection todos os métodos de adição e remoção são opcionais e podem lançar UnsupportedOperationException – As mudanças principais em relação a Collection é que tem seus itens ordenado. Os itens da List são ordenados em índice que vão de 0 a (size() -1), conformes veremos a seguir, e usar índice fora desse range gera IndexOutOfBoundsException.
  • 176. Collections • java.util.List<E> extends Collection<E>: – Uma List é uma coleção ordenada (não classificada), muito parecida com arrays, porem com bem mais funcionalidades e sem limite de tamanho. – Os métodos add() e addAll() da interface Collection adicionam itens ao final da List. – Assim como as Collection todos os métodos de adição e remoção são opcionais e podem lançar UnsupportedOperationException – As mudanças principais em relação a Collection é que tem seus itens ordenado. Os itens da List são ordenados em índice que vão de 0 a (size() -1), conformes veremos a seguir, e usar índice fora desse range gera IndexOutOfBoundsException.
  • 177. Collections • java.util.List<E> extends Collection<E>: – Uma List é uma coleção ordenada (não classificada), muito parecida com arrays, porem com bem mais funcionalidades e sem limite de tamanho. – Os métodos add() e addAll() da interface Collection adicionam itens ao final da List. – Assim como as Collection todos os métodos de adição e remoção são opcionais e podem lançar UnsupportedOperationException – As mudanças principais em relação a Collection é que tem seus itens ordenado. Os itens da List são ordenados em índice que vão de 0 a (size() -1), conformes veremos a seguir, e usar índice fora desse range gera IndexOutOfBoundsException.
  • 178. Collections • java.util.List<E> extends Collection<E>: – Uma List é uma coleção ordenada (não classificada), muito parecida com arrays, porem com bem mais funcionalidades e sem limite de tamanho. – Os métodos add() e addAll() da interface Collection adicionam itens ao final da List. – Assim como as Collection todos os métodos de adição e remoção são opcionais e podem lançar UnsupportedOperationException – As mudanças principais em relação a Collection é que tem seus itens ordenado. Os itens da List são ordenados em índice que vão de 0 a (size() -1), conformes veremos a seguir, e usar índice fora desse range gera IndexOutOfBoundsException.
  • 179. Collections • java.util.List<E> extends Collection<E>: boolean add(int i, E e) boolean addAll(int i, Collection<? extends E> c) E get(int i) int indexOf(Object o) int lastIndexOf(Object o) ListIterator<E> listIterator() ListIterator<E> listIterator(int i) E remove(int i) E set(int index, E element) List<E> subList(int fromIndex, int toIndex)
  • 180. Collections • java.util.List<E> extends Collection<E>: boolean add(int i, E e) boolean addAll(int i, Collection<? extends E> c) E get(int i) int indexOf(Object o) Adiciona o elemento e na posição de índice i. Se houver, o antigo int lastIndexOf(Object o) elemento do índice e seus ListIterator<E> listIterator() posteriores terão seus índices ListIterator<E> listIterator(int i) incrementados E remove(int i) E set(int index, E element) List<E> subList(int fromIndex, int toIndex)
  • 181. Collections • java.util.List<E> extends Collection<E>: boolean add(int i, E e) boolean addAll(int i, Collection<? extends E> c) E get(int i) int indexOf(Object o) Adiciona os elemento de c na posição de índice i. Se houver, o int lastIndexOf(Object o) antigo elemento do índice e seus ListIterator<E> listIterator() posteriores terão seus índices ListIterator<E> listIterator(int i) incrementados em c.size() E remove(int i) E set(int index, E element) List<E> subList(int fromIndex, int toIndex)
  • 182. Collections • java.util.List<E> extends Collection<E>: boolean add(int i, E e) boolean addAll(int i, Collection<? extends E> c) E get(int i) int indexOf(Object o) Retorna o elemento do índice i int lastIndexOf(Object o) ListIterator<E> listIterator() ListIterator<E> listIterator(int i) E remove(int i) E set(int index, E element) List<E> subList(int fromIndex, int toIndex)
  • 183. Collections • java.util.List<E> extends Collection<E>: boolean add(int i, E e) boolean addAll(int i, Collection<? extends E> c) E get(int i) int indexOf(Object o) Retorna o índice do primeiro objeto da list igual ao enviado ou int lastIndexOf(Object o) -1 caso não exista o objeto na ListIterator<E> listIterator() coleção. ListIterator<E> listIterator(int i) E remove(int i) E set(int index, E element) List<E> subList(int fromIndex, int toIndex)
  • 184. Collections • java.util.List<E> extends Collection<E>: boolean add(int i, E e) boolean addAll(int i, Collection<? extends E> c) E get(int i) int indexOf(Object o) Retorna o índice do ultimo objeto da list igual ao enviado ou -1 caso int lastIndexOf(Object o) não exista o objeto na coleção. ListIterator<E> listIterator() ListIterator<E> listIterator(int i) E remove(int i) E set(int index, E element) List<E> subList(int fromIndex, int toIndex)
  • 185. Collections • java.util.List<E> extends Collection<E>: boolean add(int i, E e) boolean addAll(int i, Collection<? extends E> c) E get(int i) int indexOf(Object o) Retorna um ListIterator desta List. Este objeto é uma extensão do int lastIndexOf(Object o) Iterator, com a diferença que ListIterator<E> listIterator() você pode caminhar p/ frente ou ListIterator<E> listIterator(int i) p/ traz na lista, alem de adicionar E remove(int i) e alterar elementos no índice corrente. E set(int index, E element) List<E> subList(int fromIndex, int toIndex)
  • 186. Collections • java.util.List<E> extends Collection<E>: public interface ListIterator<E> extends Iterator<E> { boolean hasNext() Retorna um ListIterator desta List. E next() Este objeto é uma extensão do int nextIndex() Iterator, com a diferença que boolean hasPrevious() você pode caminhar p/ frente ou E previous() p/ traz na lista, alem de adicionar int previousIndex() e alterar elementos no índice void add(E e) corrente. void set(E e) void remove() }
  • 187. Collections • java.util.List<E> extends Collection<E>: public interface ListIterator<E> extends Iterator<E> { boolean hasNext() Verifica se há um próximo E next() elemento na List. int nextIndex() boolean hasPrevious() E previous() int previousIndex() void add(E e) void set(E e) void remove() }
  • 188. Collections • java.util.List<E> extends Collection<E>: public interface ListIterator<E> extends Iterator<E> { boolean hasNext() Retorna o próximo elemento da E next() List. int nextIndex() boolean hasPrevious() Se não houver o próximo E previous() elemento uma int previousIndex() NoSuchElementException é void add(E e) lançada. void set(E e) void remove() }
  • 189. Collections • java.util.List<E> extends Collection<E>: public interface ListIterator<E> extends Iterator<E> { boolean hasNext() Retorna o índice do próximo E next() elemento da List. int nextIndex() boolean hasPrevious() Se não houver um próximo E previous() elemento retorna o tamanha da int previousIndex() lista, ou seja, o mesmo que void add(E e) lista.size(). void set(E e) void remove() }
  • 190. Collections • java.util.List<E> extends Collection<E>: public interface ListIterator<E> extends Iterator<E> { boolean hasNext() Verifica se há um elemento E next() anterior na List. int nextIndex() boolean hasPrevious() E previous() int previousIndex() void add(E e) void set(E e) void remove() }
  • 191. Collections • java.util.List<E> extends Collection<E>: public interface ListIterator<E> extends Iterator<E> { boolean hasNext() Retorna o elemento anterior da E next() List. int nextIndex() boolean hasPrevious() Se não houver o elemento E previous() anterior uma int previousIndex() NoSuchElementException é void add(E e) lançada. void set(E e) void remove() }
  • 192. Collections • java.util.List<E> extends Collection<E>: public interface ListIterator<E> extends Iterator<E> { boolean hasNext() Retorna o índice do elemento E next() anterior da List. int nextIndex() boolean hasPrevious() Se não houver um elemento E previous() anterior retorna -1. int previousIndex() void add(E e) void set(E e) void remove() }
  • 193. Collections • java.util.List<E> extends Collection<E>: public interface ListIterator<E> extends Iterator<E> { boolean hasNext() Adiciona o elemento e a List no E next() índice atual, entre nextIndex() e int nextIndex() previousIndex(). boolean hasPrevious() E previous() int previousIndex() void add(E e) void set(E e) void remove() }
  • 194. Collections • java.util.List<E> extends Collection<E>: public interface ListIterator<E> extends Iterator<E> { boolean hasNext() Substitui o último elemento E next() retornado por next ou previous. int nextIndex() boolean hasPrevious() Se anteriormente next / previous E previous() não foi chamado ou add / remove int previousIndex() foi invocado será lançada uma void add(E e) IllegalStateException void set(E e) void remove() }
  • 195. Collections • java.util.List<E> extends Collection<E>: public interface ListIterator<E> extends Iterator<E> { boolean hasNext() Remove o último elemento E next() retornado por next ou previous. int nextIndex() boolean hasPrevious() Se anteriormente next / previous E previous() não foi chamado ou add / remove int previousIndex() foi invocado será lançada uma void add(E e) IllegalStateException void set(E e) void remove() }
  • 196. Collections • java.util.List<E> extends Collection<E>: boolean add(int i, E e) boolean addAll(int i, Collection<? extends E> c) E get(int i) int indexOf(Object o) Igual ao método anterior com a diferença que o índice corrente int lastIndexOf(Object o) do ListIterator será o índice ListIterator<E> listIterator() passado. ListIterator<E> listIterator(int i) Obs.: é possível retornar para E remove(int i) antes do índice passado. E set(int index, E element) List<E> subList(int fromIndex, int toIndex)
  • 197. Collections • java.util.List<E> extends Collection<E>: boolean add(int i, E e) boolean addAll(int i, Collection<? extends E> c) E get(int i) int indexOf(Object o) Remove o elemento de índice i da List e o retorna. Importante!!! int lastIndexOf(Object o) Integer indexA = 1; int indexB = 1; ListIterator<E> listIterator() list.remove(indexA) list.remove(indexB) ListIterator<E> listIterator(int i) são operações totalmente diferentes E remove(int i) O 1° remove um objeto Integer == 1 O 2° remove o objeto no índice 1 E set(int index, E element) List<E> subList(int fromIndex, int toIndex)
  • 198. Collections • java.util.List<E> extends Collection<E>: boolean add(int i, E e) boolean addAll(int i, Collection<? extends E> c) E get(int i) int indexOf(Object o) Substitui o objeto no índice index pelo element enviado e retorna o int lastIndexOf(Object o) objeto substituído. ListIterator<E> listIterator() ListIterator<E> listIterator(int i) E remove(int i) E set(int index, E element) List<E> subList(int fromIndex, int toIndex)
  • 199. Collections • java.util.List<E> extends Collection<E>: boolean add(int i, E e) boolean addAll(int i, Collection<? extends E> c) E get(int i) int indexOf(Object o) Retorna o elemento do índice fromIndex (inclusive) até os int lastIndexOf(Object o) elementos de índice toIndex ListIterator<E> listIterator() (exclusive). Mudança na subList são refletidas na List original, o contrario ListIterator<E> listIterator(int i) impossibilita o uso da subList, que, se E remove(int i) usada, lançará ConcurrentModificationException E set(int index, E element) List<E> subList(int fromIndex, int toIndex)
  • 200. Collections • Ok, mas existe alguma forma de criar Coleções classificadas ? – Sim!! • Mas antes de vermos como manter listas classificadas precisamos conhecer duas interfaces Comparator<T> e Comparable<T> • Estas duas interfaces indicam a ordem de classificação dos objetos
  • 201. Collections • Ok, mas existe alguma forma de criar Coleções classificadas ? – Sim!! • Mas antes de vermos como manter listas classificadas precisamos conhecer duas interfaces Comparator<T> e Comparable<T> • Estas duas interfaces indicam a ordem de classificação dos objetos
  • 202. Collections • Ok, mas existe alguma forma de criar Coleções classificadas ? – Sim!! • Mas antes de vermos como manter listas classificadas precisamos conhecer duas interfaces Comparator<T> e Comparable<T> • Estas duas interfaces indicam a ordem de classificação dos objetos
  • 203. Collections • Ok, mas existe alguma forma de criar Coleções classificadas ? – Sim!! • Mas antes de vermos como manter listas classificadas precisamos conhecer duas interfaces Comparator<T> e Comparable<T> • Estas duas interfaces indicam a ordem de classificação dos objetos
  • 204. Collections • Comparable<T> é uma interface que só tem um método: int compareTo(T o) – Retorna negativo, zero, ou positivo quando este objeto é menor que, igual que ou maior que, respectivamente. • Objetos que tem ordem natural implementam esta interface, por exemplo: String texto1 = “dado”, texto2 = “morta”; if (texto1.compareTo(texto2) < 0) { System.out.println(“texto1 vem 1°”); } else if (texto1.compareTo(texto2) > 0) { System.out.println(“texto1 vem 2°”); }
  • 205. Collections • Comparable<T> é uma interface que só tem um método: int compareTo(T o) – Retorna negativo, zero, ou positivo quando este objeto é menor que, igual que ou maior que, respectivamente. • Objetos que tem ordem natural implementam esta interface... por exemplo: String texto1 = “dado”, texto2 = “morta”; if (texto1.compareTo(texto2) < 0) { System.out.println(“texto1 vem 1°”); } else if (texto1.compareTo(texto2) > 0) { System.out.println(“texto1 vem 2°”); }
  • 206. Collections • Comparable<T> é uma interface que só tem um método: int compareTo(T o) – Retorna negativo, zero, ou positivo quando este objeto é menor que, igual que ou maior que, respectivamente. • Objetos que tem ordem natural implementam esta interface... por exemplo: String texto1 = “dado”, texto2 = “morta”; if (texto1.compareTo(texto2) < 0) { System.out.println(“texto1 vem 1°”); } else if (texto1.compareTo(texto2) > 0) { System.out.println(“texto1 vem 2°”); }
  • 207. Collections • Comparable<T> é uma interface que só tem um método: int compareTo(T o) – Retorna negativo, zero, ou positivo quando este objeto é menor que, igual que ou maior que, respectivamente. • Objetos que tem ordem natural implementam esta interface... por exemplo: String texto1 = “dado”, texto2 = “morta”; if (texto1.compareTo(texto2) < 0) { System.out.println(“texto1 vem 1°”); // imprime este } else if (texto1.compareTo(texto2) > 0) { System.out.println(“texto1 vem 2°”); }
  • 208. Collections • Alguma vezes precisamos comparar objetos que não tem ordem natural, ou então comparar objetos por propriedades diferentes da ordem natural • Neste caso utilizamos Comparator<T> int compare(T o1, T o2) • Um comparator funciona como um objeto ordenador, que recebe dois objetos, e compara o primeiro com o segundo (nesta ordem) de acordo com os critérios definidos no comparator.
  • 209. Collections • Alguma vezes precisamos comparar objetos que não tem ordem natural, ou então comparar objetos por propriedades diferentes da ordem natural • Neste caso utilizamos Comparator<T> int compare(T o1, T o2) • Um comparator funciona como um objeto ordenador, que recebe dois objetos, e compara o primeiro com o segundo (nesta ordem) de acordo com os critérios definidos no comparator.
  • 210. Collections • Alguma vezes precisamos comparar objetos que não tem ordem natural, ou então comparar objetos por propriedades diferentes da ordem natural • Neste caso utilizamos Comparator<T> int compare(T o1, T o2) • Um Comparator funciona como um objeto ordenador, que recebe dois objetos, e compara o primeiro com o segundo (nesta ordem) de acordo com os critérios definidos no Comparator.
  • 211. Collections • Há! E antes de vermos como funcionam as listas ordenadas precisamos conhecer mais uma forma de usar os genéricos <? super E> • Enquanto que <? extends E> não permite o uso dos parâmetros tipados com E, o <? super E> permite o uso, e o parâmetro deve ser da classe E ou de uma Sub Classe de E, sim! De uma Sub classe. List<? super Number> numbers; numbers = new ArrayList<Number>(); // ok compila! numbers = new ArrayList<Integer>(); // NÃO compila! numbers = new ArrayList<Object>(); // ok compila! numbers.add(1); //numbers aceita qualquer sub classe de Number numbers.add(2.33); //ok também aceita • Como a List é da classe Number ou de uma Super classe de Number (no caso Object), é garantido que dentro de numbers vai caber qualquer classe Number ou sub-classe de Number na lista.
  • 212. Collections • Há! E antes de vermos como funcionam as listas ordenadas precisamos conhecer mais uma forma de usar os genéricos <? super E> • Enquanto que <? extends E> não permite o uso dos parâmetros tipados com E, o <? super E> permite o uso, e o parâmetro deve ser da classe E ou de uma Sub Classe de E, sim! De uma Sub classe... List<? super Number> numbers; numbers = new ArrayList<Number>(); // ok compila! numbers = new ArrayList<Integer>(); // NÃO compila! numbers = new ArrayList<Object>(); // ok compila! numbers.add(1); //numbers aceita qualquer sub classe de Number numbers.add(2.33); //ok também aceita • Como a List é da classe Number ou de uma Super classe de Number (no caso Object), é garantido que dentro de numbers vai caber qualquer classe Number ou sub-classe de Number na lista.
  • 213. Collections • Há! E antes de vermos como funcionam as listas ordenadas precisamos conhecer mais uma forma de usar os genéricos <? super E> • Enquanto que <? extends E> não permite o uso dos parâmetros tipados com E, o <? super E> permite o uso, e o parâmetro deve ser da classe E ou de uma Sub Classe de E, sim! De uma Sub classe... Por exemplo: List<? super Number> numbers; numbers = new ArrayList<Number>(); // ok compila! numbers = new ArrayList<Integer>(); // NÃO compila! numbers = new ArrayList<Object>(); // ok compila! numbers.add(1); //numbers aceita qualquer sub classe de Number numbers.add(2.33); //ok também aceita • Como a List é da classe Number ou de uma Super classe de Number (no caso Object), é garantido que dentro de numbers vai caber qualquer classe Number ou sub-classe de Number na lista.
  • 214. Collections • Há! E antes de vermos como funcionam as listas ordenadas precisamos conhecer mais uma forma de usar os genéricos <? super E> • Enquanto que <? extends E> não permite o uso dos parâmetros tipados com E, o <? super E> permite o uso, e o parâmetro deve ser da classe E ou de uma Sub Classe de E, sim! De uma Sub classe... Por exemplo: List<? super Number> numbers; numbers = new ArrayList<Number>(); // ok compila! numbers = new ArrayList<Integer>(); // NÃO compila! numbers = new ArrayList<Object>(); // ok compila! numbers.add(1); //numbers aceita qualquer sub classe de Number numbers.add(2.33); //ok também aceita • Como a List é do tipo <Number> ou de uma Super classe de <Number> (no caso Object), é garantido que dentro da lista vai caber qualquer classe Number ou sub-classe de Number na lista.
  • 215. Collections • Agora vamos lá! Vamos conhecer como funciona as classes classificadas java.util.SortedSet<E> extends Set<E> • Esta interface é de uma coleção classificada, onde a classificação do comparator usado por ela, ou a ordem natural é mantida sempre • Não importa a ordem em que os elementos são adicionados a coleção, os itens dentro da coleção serão sempre mantidas na classificação definida por seu comparator ou pela ordem natural.
  • 216. Collections • Agora vamos lá! Vamos conhecer como funciona as classes classificadas java.util.SortedSet<E> extends Set<E> • Esta interface é de uma coleção classificada, onde a classificação do Comparator usado por ela, ou a ordem natural é mantida sempre • Não importa a ordem em que os elementos são adicionados a coleção, os itens dentro da coleção serão sempre mantidas na classificação definida por seu comparator ou pela ordem natural.
  • 217. Collections • Agora vamos lá! Vamos conhecer como funciona as classes classificadas java.util.SortedSet<E> extends Set<E> • Esta interface é de uma coleção classificada, onde a classificação do Comparator usado por ela, ou a ordem natural é mantida sempre • Não importa a ordem em que os elementos são adicionados a coleção, os itens dentro da coleção serão sempre mantidas na classificação definida por seu Comparator ou pela ordem natural.
  • 218. Collections • java.util.SortedSet<E> extends Set<E>: Comparator<? super E> comparator() E first() SortedSet<E> tailSet(E fromElement) E last() SortedSet<E> headSet(E toElement) SortedSet<E> subSet(E fromElement, E toElement)
  • 219. Collections • java.util.SortedSet<E> extends Set<E>: Comparator<? super E> comparator() E first() SortedSet<E> tailSet(E fromElement) E last() SortedSet<E> headSet(E toElement) SortedSet<E> subSet(E fromElement, E toElement) Se a ordem usada na List classificada for a natural retorna null, caso contrario retorna o Comparator que define a ordem usada na classificação. O Comparator é obrigatoriamente do mesmo tipo de E ou de um super tipo de E. Obs.: sendo o Comparator<? super E> seu método compare(E o1, E o2) vai aceitar objetos do tipo E ou de sub-classe, assim mantemos a integridade.
  • 220. Collections • java.util.SortedSet<E> extends Set<E>: Comparator<? super E> comparator() E first() SortedSet<E> tailSet(E fromElement) E last() SortedSet<E> headSet(E toElement) SortedSet<E> subSet(E fromElement, E toElement) Retorna o primeiro elemento, de acordo com a classificação desse SortedSet. Não importando a ordem em que os elementos são colocados na coleção, será retornado o primeiro elemento de acordo com a classificação da SortedSet.
  • 221. Collections • java.util.SortedSet<E> extends Set<E>: Comparator<? super E> comparator() E first() SortedSet<E> tailSet(E fromElement) E last() SortedSet<E> headSet(E toElement) SortedSet<E> subSet(E fromElement, E toElement) Define o tail – “rabo” – de uma sub SortedSet que inicia em fromElement (inclusive) incluindo todos os elementos maiores que fromElement - A sub coleção criada é um reflexo da coleção principal, e quaisquer operações em uma coleção será refletida na outra, e as duas coleções podem ser alteradas sem problemas. - A sub coleção não pode receber nenhum elemento menor que fromElement, gerando um IllegalArgumentException: key out of range
  • 222. Collections • java.util.SortedSet<E> extends Set<E>: Comparator<? super E> comparator() E first() SortedSet<E> tailSet(E fromElement) E last() SortedSet<E> headSet(E toElement) SortedSet<E> subSet(E fromElement, E toElement) Retorna o ultimo elemento, de acordo com a classificação desse SortedSet.
  • 223. Collections • java.util.SortedSet<E> extends Set<E>: Comparator<? super E> comparator() E first() SortedSet<E> tailSet(E fromElement) E last() SortedSet<E> headSet(E toElement) SortedSet<E> subSet(E fromElement, E toElement) Define a head – “cabeça” – de uma sub SortedSet que termina em toElement (exclusive) incluindo todos os elementos menores a toElement - A sub coleção criada é um reflexo da coleção principal, e quaisquer operações em uma coleção será refletida na outra, e as duas coleções podem ser alteradas sem problemas.. - A sub coleção não pode receber nenhum elemento maior ou igual que toElement, gerando um IllegalArgumentException: key out of range
  • 224. Collections • java.util.SortedSet<E> extends Set<E>: Comparator<? super E> comparator() E first() SortedSet<E> tailSet(E fromElement) E last() SortedSet<E> headSet(E toElement) SortedSet<E> subSet(E fromElement, E toElement) Cria uma sub SortedSet com os elementos da coleção original iniciando em fromElement (inculsive) e terminando em toElement (exclusive). - A sub coleção criada é um reflexo da coleção principal, e quaisquer operações em uma coleção será refletida na outra, e as duas coleções podem ser alteradas sem problemas. - A nova coleção não pode receber nenhum elemento < fromElement ou >= toElement, gerando um IllegalArgumentException: key out of range
  • 225. Collections • Bem legal, mas e se eu quiser encontrar o primeiro objeto da coleção maior a element, ou um objeto menor a element? Entre outras informações mais detalhas?
  • 226. Collections • Bem legal, mas e se eu quiser encontrar o primeiro objeto da coleção maior a element, ou um objeto menor a element? Entre outras informações mais detalhas? – Nesse caso você precisa de uma java.util.NavigableSet<E> extends SortedSet<E>
  • 227. Collections • java.util.NavigableSet<E> extends SortedSet<E>: E lower(E e) E floor(E e) E higher(E e) E ceiling(E e) E pollFirst() E pollLast() Iterator<E> descendingIterator() NavigableSet<E> descendingSet() NavigableSet<E> headSet(E toElement, boolean inclusive) NavigableSet<E> tailSet(E fromElement, boolean inclusive) NavigableSet<E> subSet(E from, boolean inc, E to, boolean inc)
  • 228. Collections • java.util.NavigableSet<E> extends SortedSet<E>: E lower(E e) //primeiro elemento menor a e E floor(E e) E higher(E e) E ceiling(E e) E pollFirst() E pollLast() Iterator<E> descendingIterator() NavigableSet<E> descendingSet() NavigableSet<E> headSet(E toElement, boolean inclusive) NavigableSet<E> tailSet(E fromElement, boolean inclusive) NavigableSet<E> subSet(E from, boolean inc, E to, boolean inc)
  • 229. Collections • java.util.NavigableSet<E> extends SortedSet<E>: E lower(E e) //primeiro elemento menor a e E floor(E e) //primeiro elemento menor ou igual a e E higher(E e) E ceiling(E e) E pollFirst() E pollLast() Iterator<E> descendingIterator() NavigableSet<E> descendingSet() NavigableSet<E> headSet(E toElement, boolean inclusive) NavigableSet<E> tailSet(E fromElement, boolean inclusive) NavigableSet<E> subSet(E from, boolean inc, E to, boolean inc)
  • 230. Collections • java.util.NavigableSet<E> extends SortedSet<E>: E lower(E e) //primeiro elemento menor a e E floor(E e) //primeiro elemento menor ou igual a e E higher(E e) //primeiro elemento maior a e E ceiling(E e) E pollFirst() E pollLast() Iterator<E> descendingIterator() NavigableSet<E> descendingSet() NavigableSet<E> headSet(E toElement, boolean inclusive) NavigableSet<E> tailSet(E fromElement, boolean inclusive) NavigableSet<E> subSet(E from, boolean inc, E to, boolean inc)
  • 231. Collections • java.util.NavigableSet<E> extends SortedSet<E>: E lower(E e) //primeiro elemento menor a e E floor(E e) //primeiro elemento menor ou igual a e E higher(E e) //primeiro elemento maior a e E ceiling(E e) //primeiro elemento maior ou igual a e E pollFirst() E pollLast() Iterator<E> descendingIterator() NavigableSet<E> descendingSet() NavigableSet<E> headSet(E toElement, boolean inclusive) NavigableSet<E> tailSet(E fromElement, boolean inclusive) NavigableSet<E> subSet(E from, boolean inc, E to, boolean inc)
  • 232. Collections • java.util.NavigableSet<E> extends SortedSet<E>: E lower(E e) //primeiro elemento menor a e E floor(E e) //primeiro elemento menor ou igual a e E higher(E e) //primeiro elemento maior a e E ceiling(E e) //primeiro elemento maior ou igual a e E pollFirst() //remove e retorna o primeiro elemento ou null E pollLast() Iterator<E> descendingIterator() NavigableSet<E> descendingSet() NavigableSet<E> headSet(E toElement, boolean inclusive) NavigableSet<E> tailSet(E fromElement, boolean inclusive) NavigableSet<E> subSet(E from, boolean inc, E to, boolean inc)
  • 233. Collections • java.util.NavigableSet<E> extends SortedSet<E>: E lower(E e) //primeiro elemento menor a e E floor(E e) //primeiro elemento menor ou igual a e E higher(E e) //primeiro elemento maior a e E ceiling(E e) //primeiro elemento maior ou igual a e E pollFirst() //remove e retorna o primeiro elemento ou null E pollLast() //remove e retorna o ultimo elemento ou null Iterator<E> descendingIterator() NavigableSet<E> descendingSet() NavigableSet<E> headSet(E toElement, boolean inclusive) NavigableSet<E> tailSet(E fromElement, boolean inclusive) NavigableSet<E> subSet(E from, boolean inc, E to, boolean inc)
  • 234. Collections • java.util.NavigableSet<E> extends SortedSet<E>: E lower(E e) //primeiro elemento menor a e E floor(E e) //primeiro elemento menor ou igual a e E higher(E e) //primeiro elemento maior a e E ceiling(E e) //primeiro elemento maior ou igual a e E pollFirst() //remove e retorna o primeiro elemento ou null E pollLast() //remove e retorna o ultimo elemento ou null Iterator<E> descendingIterator() //Iterator na ordem inversa NavigableSet<E> descendingSet() NavigableSet<E> headSet(E toElement, boolean inclusive) NavigableSet<E> tailSet(E fromElement, boolean inclusive) NavigableSet<E> subSet(E from, boolean inc, E to, boolean inc)
  • 235. Collections • java.util.NavigableSet<E> extends SortedSet<E>: E lower(E e) //primeiro elemento menor a e E floor(E e) //primeiro elemento menor ou igual a e E higher(E e) //primeiro elemento maior a e E ceiling(E e) //primeiro elemento maior ou igual a e E pollFirst() //remove e retorna o primeiro elemento ou null E pollLast() //remove e retorna o ultimo elemento ou null Iterator<E> descendingIterator() //Iterator na ordem inversa NavigableSet<E> descendingSet() //NavigableSet inverso NavigableSet<E> headSet(E toElement, boolean inclusive) NavigableSet<E> tailSet(E fromElement, boolean inclusive) NavigableSet<E> subSet(E from, boolean inc, E to, boolean inc)
  • 236. Collections • java.util.NavigableSet<E> extends SortedSet<E>: E lower(E e) //primeiro elemento menor a e E floor(E e) //primeiro elemento menor ou igual a e E higher(E e) //primeiro elemento maior a e E ceiling(E e) //primeiro elemento maior ou igual a e E pollFirst() Igual aos métodos da //remove e retorna o primeiro elemento ou null classe SortedSet porém E pollLast() //remove e retorna o ultimo elemento pode escolher aqui você ou null Iterator<E> descendingIterator() se o elemento enviado é //Iterator na ordem inversa inclusive ou exclusive. NavigableSet<E> descendingSet() //NavigableSet inverso NavigableSet<E> headSet(E toElement, boolean inclusive) NavigableSet<E> tailSet(E fromElement, boolean inclusive) NavigableSet<E> subSet(E from, boolean inc, E to, boolean inc)
  • 237. Collections • Existem mais interfaces de Collection ? – Que descendam de Collection? nenhuma que vá cair na prova! Mas é bastante vasta a Java Collection Framework
  • 238. Collections • Existem mais interfaces de Collection ? – Que descendam de Collection? nenhuma que vá cair na prova! Mas é bastante vasta a Java Collection Framework • Sobre interfaces só falta Map<E> e suas sub-interfaces, mas este nós só vamos ver depois das classes Concretas de Collection.
  • 239. Collections • Existem mais interfaces de Collection ? – Que descendam de Collection? nenhuma que vá cair na prova! Mas é bastante vasta a Java Collection Framework • Sobre interfaces só falta Map<E> e suas sub-interfaces, mas este nós só vamos ver depois das classes Concretas de Collection. • Então vamos as classes concretas
  • 240. <<Interface>> Collection<E> Collections <<Interface>> List<E> Vector<E> ArrayList<E> • Para o exame você só precisa saber que as duas classes tem a mesma implementação, exceto pela sincronização: – Vector: tem todos os seus métodos sincronizados – ArrayList: NÃO tem os métodos sincronizados. • Só ter os métodos sincronizados não garante a classe que ela é Thread safe, por isso muito cuidado com as perguntas da prova, e é aconselhável o uso de ArrayList pois Vector é mais lenta devido a sync
  • 241. <<Interface>> Collection<E> Collections <<Interface>> <<Interface>> List<E> Queue<E> • LinkedList<E> PriorityQueue<E> • LinkedList: Implementa List e Queue, portanto tem todas funcionalidades de List além da Fila, onde o modelo de fila implementado é FIFO (firs-in-first-out). • PriorityQueue: Essa é uma das poucas que apenas a implementação não da todas as pistas, PriorityQueue é uma fila classificada, ou seja, respeita a classificação natural dos elementos ou de um Comparator. – priorityQueue.poll() retorna sempre o menor elemento (de acordo com o Comparator da fila ou a ordem natural). – A PriorityQueue aceita valores duplicados – Não usar Comparator com objetos não classificáveis gera exceção ao tentar adicionar elementos.
  • 242. <<Interface>> Collection<E> Collections <<Interface>> Set<E> • TreeSet: uma das classes mais interessante e que mais cai na prova: <<Interface>> – É uma coleção de elementos únicos em SortedSet<E> relação a classificação definida. – Deve-se usar Comparator, quando não se quer usar, ou não existe, uma classificação natural. <<Interface>> NavigableSet<E> – Usar a classe sem Comparator com um objeto sem classificação natural gera exceção ao adicionar o elemento. TreeSet<E> – Se a comparação retornar igual para dois elementos, e eles não forem iguais, o TreeSet não deixará incluir os dois elementos, será considerado para o Set como elementos duplicados, o que não é permitido, e false será retornado. – Estudem os métodos subSet, tailSet, headSet
  • 243. Collections • Bom chegou a hora, vamos para as classes hash, e portanto precisamos explicar pra que serve o código hash e como as classes se comportam. • Antes de verificar o comportamento de uma coleção hash, precisamos ver como as demais se comportam. – Sempre que você da um contains(Object o), a coleção começa a verificar seus objetos testando uma a um se o.equals(next) ate encontrar o objeto, retornando se encontrou ou não. – Quando o método usado é remove(Object o), o processo é o mesmo a coleção testa equals um a um ate encontrar um objeto igual e o remove. – Se a coleção for um Set, a cada add(Object o), antes de adicionar a coleção verifica se contains(Object o), daí você começa a entender o problema e as implicações de ficar percorrendo a coleção tantas vezes testando tantos equals.
  • 244. Collections • Para resolver esse problema de performance que vai se acumulando as coleções hash se usam de outro conceito para fazer busca de seus elementos. • Primeiro vamos revisar duas das propriedades do hashCode:
  • 245. Collections • Para resolver esse problema de performance que vai se acumulando as coleções hash se usam de outro conceito para fazer busca de seus elementos. • Primeiro vamos revisar duas das propriedades do hashCode:
  • 246. Collections • Para resolver esse problema de performance que vai se acumulando as coleções hash se usam de outro conceito para fazer busca de seus elementos. • Primeiro vamos revisar duas das propriedades do hashCode: – Se dois objetos a e b forem iguais e a.equals(b) for true então a.hashCode() == b.hashCode() – O inverso não é verdadeiro, quando a.equals(b) for false os hashCode() podem ser iguais ou diferentes.
  • 247. Collections • Para resolver esse problema de performance que vai se acumulando as coleções hash se usam de outro conceito para fazer busca de seus elementos. • Primeiro vamos revisar duas das propriedades do hashCode: – Se dois objetos a e b forem iguais e a.equals(b) for true então a.hashCode() == b.hashCode() – O inverso não é verdadeiro, quando a.equals(b) for false os hashCode() podem ser iguais ou diferentes. • As coleções hash se utilizam desses dois conceitos para otimizar a pesquisa a seus elementos.
  • 248. Collections • Quando você adiciona um elemento a uma coleção hash ela verifica o hashCode do objeto, e o coloca em um recipiente onde só há objetos com o mesmo hashCode, se o recipiente para aquele hashCode ainda não existia ela cria um novo. – Assim é mantido o processo sempre que se adiciona um objeto. • Quando você, por exemplo, precisa verificar se um objeto existe, as coleções hash tem muito menos trabalho para procurar: – primeiro elas verificam o código hash do objeto, e olha no recipiente daquele código – E então verifica um a um, apenas nesse recipiente, através de equals() para ver se há algum objeto que coiencidente.
  • 249. Collections • Quando você adiciona um elemento a uma coleção hash ela verifica o hashCode do objeto, e o coloca em um recipiente onde só há objetos com o mesmo hashCode, se o recipiente para aquele hashCode ainda não existia ela cria um novo. – Assim é mantido o processo sempre que se adiciona um objeto. • Quando você, por exemplo, precisa verificar se um objeto existe, as coleções hash tem muito menos trabalho para procurar: – primeiro elas verificam o código hash do objeto, e olha no recipiente daquele código – E então verifica um a um, apenas nesse recipiente, através de equals() para ver se há algum objeto que coiencidente.
  • 250. Collections • Quando você adiciona um elemento a uma coleção hash ela verifica o hashCode do objeto, e o coloca em um recipiente onde só há objetos com o mesmo hashCode, se o recipiente para aquele hashCode ainda não existia ela cria um novo. – Assim é mantido o processo sempre que se adiciona um objeto. • Quando você, por exemplo, precisa verificar se um objeto existe, as coleções hash tem muito menos trabalho para procurar: – primeiro elas verificam o código hash do objeto, e olha no recipiente daquele código – E então verifica um a um, apenas nesse recipiente, através de equals() para ver se há algum objeto que coincidente.
  • 251. Collections • Portanto a performance e o funcionamento de uma coleção hash esta intimamente ligada ao quão bem implementado é um código hash. • Para um melhor entendimento vamos criar uma classe Aluno: public class Aluno { private String nome; public Aluno(String nome) { this.nome = nome;} public String getNome() { return this.nome;} @Override public boolean equals(Object o) { if (nome == null) return false; return (o instanceof Aluno) && nome.equals(((Aluno)o).nome); } @Override public int hashCode() { //hashCode vem da 1° letra do nome return (nome == null) ? 0 : nome.charAt(0); } }
  • 252. Collections • Portanto a performance e o funcionamento de uma coleção hash esta intimamente ligada ao quão bem implementado é um código hash. • Para um melhor entendimento vamos criar uma classe Aluno: public class Aluno { private String nome; public Aluno(String nome) { this.nome = nome;} public String getNome() { return this.nome;} @Override public boolean equals(Object o) { if (nome == null) return false; return (o instanceof Aluno) && nome.equals(((Aluno)o).nome); } @Override public int hashCode() { //hashCode vem da 1° letra do nome return (nome == null) ? 0 : nome.charAt(0); } }
  • 253. Collections • Portanto a performance e o funcionamento de uma coleção hash esta intimamente ligada ao quão bem implementado é um código hash. • Para um melhor entendimento vamos criar uma classe Aluno: public class Aluno { private String nome; public Aluno(String nome) { this.nome = nome;} public String getNome() { return this.nome;} @Override public boolean equals(Object o) { if (nome == null) return false; return (o instanceof Aluno) && nome.equals(((Aluno)o).nome); } @Override public int hashCode() { //hashCode vem da 1° letra do nome return (nome == null) ? 0 : nome.charAt(0); } }
  • 254. Collections • Como é a divisão em uma coleção Hash? HashSet Set<Aluno> alunos = new HashSet<Aluno>();
  • 255. Collections • Como é a divisão em uma coleção Hash? HashSet Set<Aluno> alunos = new HashSet<Aluno>(); alunos.add(new Aluno(“Marcos”)); 77 alunos.add(new Aluno(“Matheus”)); alunos.add(new Aluno(“Magno”));
  • 256. Collections • Como é a divisão em uma coleção Hash? HashSet Set<Aluno> alunos = new HashSet<Aluno>(); alunos.add(new Aluno(“Marcos”)); 77 alunos.add(new Aluno(“Matheus”)); alunos.add(new Aluno(“Magno”));
  • 257. Collections • Como é a divisão em uma coleção Hash? HashSet Set<Aluno> alunos = new HashSet<Aluno>(); alunos.add(new Aluno(“Marcos”)); 77 alunos.add(new Aluno(“Matheus”)); alunos.add(new Aluno(“Magno”)); alunos.add(new Aluno(“Antonio”)); 66 alunos.add(new Aluno(“Ana”));
  • 258. Collections • Como é a divisão em uma coleção Hash? HashSet Set<Aluno> alunos = new HashSet<Aluno>(); alunos.add(new Aluno(“Marcos”)); 77 alunos.add(new Aluno(“Matheus”)); alunos.add(new Aluno(“Magno”)); alunos.add(new Aluno(“Antonio”)); 66 alunos.add(new Aluno(“Ana”)); alunos.add(new Aluno(“João”)); 74
  • 259. Collections • Como é a divisão em uma coleção Hash? HashSet Set<Aluno> alunos = new HashSet<Aluno>(); alunos.add(new Aluno(“Marcos”)); 77 alunos.add(new Aluno(“Matheus”)); alunos.add(new Aluno(“Magno”)); alunos.add(new Aluno(“Antonio”)); alunos.add(new Aluno(“Ana”)); 66 alunos.add(new Aluno(“João”)); Como então funciona um: 74 alunos.contains(new Aluno(“Jô”)) ? 1. A coleção busca “Jô”.hashCode() == 74 2. A coleção busca o conteiner 74 3. Então verifica todos os elementos que neste caso é apenas “João” testando: “João”.equals(“Jô”); o que retorna false e acaba o processo
  • 260. Collections • Quanto melhor implementado é o hashCode() mais rápida se torna a busca dentro da coleção hash, por exemplo, se mudarmos nossa implementação de hashCode() para: public class Aluno { //... @Override public int hashCode() { //hashCode vem da 1° letra do nome return (nome == null) ? 0 : nome.charAt(0) + nome.size(); } }
  • 261. Collections HashSet • Como seria a nova divisão ?? 7*77 539 alunos.add(new Aluno(“Matheus”)); 5*77 385 alunos.add(new Aluno(“Magno”)); 6*77 alunos.add(new Aluno(“Marcos”)); alunos.add(new Aluno(“Antonio”)); 7*66 462 alunos.add(new Aluno(“Ana”)); alunos.add(new Aluno(“João”)); 3*66 198 4*74 Como então funciona um: 296 alunos.contains(new Aluno(“Jô”)) ? 1. A coleção busca “Jô”.hashCode() == 148 2. A coleção verifica que não há o conteiner 148 3. o que retorna false e acaba o processo
  • 262. Collections • Como coleções não hash realizam a mesma busca? Aluno jo = new Aluno(“Jô”); alunos.contains(jo); //A coleção alunos iria testar equals contra cada objeto: “Matheus”.equals(jo); //false “Magno”.equals(jo); //false “Marcos”.equals(jo); //false “Antonio”.equals(jo); //false “Ana”.equals(jo); //false “João”.equals(jo); //false return false; • E essa é diferença de performance de uma coleção hash para uma normal.
  • 263. Collections • Como coleções não hash realizam a mesma busca? Aluno jo = new Aluno(“Jô”); alunos.contains(jo); //A coleção alunos iria testar equals contra cada objeto: “Matheus”.equals(jo); //false “Magno”.equals(jo); //false “Marcos”.equals(jo); //false “Antonio”.equals(jo); //false “Ana”.equals(jo); //false “João”.equals(jo); //false return false; • E essa é diferença de performance de uma coleção hash para uma normal.
  • 264. <<Interface>> Collection<E> Collections <<Interface>> Set<E> • HashSet: uma das classes mais utilizadas (e que pode gerar grandes problemas quando hashCode HashSet<E> não é bem implementado): – É uma coleção de elementos únicos não ordenada e não classificada. – A cada inserção a ordem dos elementos gerados pelo LinkedHashSet<E> iterator pode alterar totalmente. – As buscas são realizadas usando tabelas hash. • LinkedHashSet: A mudança básica para o HashSet é que a LinkedHashSet mantém armazenada a ordem de inserção. – A cada inserção a ordem dos elementos gerados pelo iterator NÃO é alterada. – É mantida a ordem de inserção. – As buscas são realizadas usando tabelas hash.
  • 265. Collections • Finalmente vamos conhecer o funcionamento dos java.util.Map<K,V> • Um Map é uma coleção de pares key-value (chave-valor), porem esta não descende de Collection<E> tendo uma interface nova. • Por exemplo: – Em um Map<String,Thread> podemos guardar instancias de Thread que são identificadas por Strings, onde é possivel gerenciar facilmente as instancias através de suas chaves. • Vamos conhecer sua interface
  • 266. Collections • Finalmente vamos conhecer o funcionamento dos java.util.Map<K,V> • Um Map é uma coleção de pares key-value (chave-valor), porem esta não descende de Collection<E> tendo uma interface nova. • Por exemplo: – Em um Map<String,Thread> podemos guardar instancias de Thread que são identificadas por Strings, onde é possivel gerenciar facilmente as instancias através de suas chaves. • Vamos conhecer sua interface
  • 267. Collections • Finalmente vamos conhecer o funcionamento dos java.util.Map<K,V> • Um Map é uma coleção de pares key-value (chave-valor), porem esta não descende de Collection<E> tendo uma interface nova. • Por exemplo: – Em um Map<String,Thread> podemos guardar instancias de Thread que são identificadas por Strings, onde é possível gerenciar facilmente as instancias através de suas chaves. • Vamos conhecer sua interface
  • 268. Collections • Finalmente vamos conhecer o funcionamento dos java.util.Map<K,V> • Um Map é uma coleção de pares key-value (chave-valor), porem esta não descende de Collection<E> tendo uma interface nova. • Por exemplo: – Em um Map<String,Thread> podemos guardar instancias de Thread que são identificadas por Strings, onde é possível gerenciar facilmente as instancias através de suas chaves. • Vamos conhecer sua interface
  • 269. Collections • Métodos de java.util.Map<K,V>: V put(K key, V value) void putAll(Map<? extends K,? extends V> m) V remove(Object key) void clear() V get(Object key) boolean containsKey(Object o) boolean containsValue(Object o) Set<Map.Entry<K, V>> entrySet() Set<K> keySet() Collection<V> values() int size() boolean isEmpty()
  • 270. Collections • Métodos de java.util.Map<K,V>: V put(K key, V value) void putAll(Map<? extends K,? extends V> m) V remove(Object key) void clear() Insere o valor passado na V get(Object key) chave indicada, e retorna o boolean containsKey(Object o) antigo valor da chave, ou null boolean containsValue(Object o) caso não exista valor anterior. Set<Map.Entry<K, V>> entrySet() Set<K> keySet() Implementação é opcional. Collection<V> values() int size() boolean isEmpty()
  • 271. Collections • Métodos de java.util.Map<K,V>: V put(K key, V value) void putAll(Map<? extends K,? extends V> m) V remove(Object key) void clear() Copia todos os valores do V get(Object key) mapa enviando m, para este boolean containsKey(Object o) mapa, nas suas respectivas boolean containsValue(Object o) chaves. Set<Map.Entry<K, V>> entrySet() É o mesmo que iterar o Set<K> keySet() entrySet() e adicionar as Collection<V> values() entradas uma a uma. int size() boolean isEmpty() Implementação é opcional.
  • 272. Collections • Métodos de java.util.Map<K,V>: V put(K key, V value) void putAll(Map<? extends K,? extends V> m) V remove(Object key) void clear() Remove, se estiver presente, V get(Object key) o mapeamento de chave boolean containsKey(Object o) enviada, retornando o valor da boolean containsValue(Object o) chave que estava mapeado. Set<Map.Entry<K, V>> entrySet() Set<K> keySet() Implementação é opcional. Collection<V> values() int size() boolean isEmpty()
  • 273. Collections • Métodos de java.util.Map<K,V>: V put(K key, V value) void putAll(Map<? extends K,? extends V> m) V remove(Object key) void clear() Remove todos as chaves e V get(Object key) valores mapeados. boolean containsKey(Object o) boolean containsValue(Object o) Implementação é opcional. Set<Map.Entry<K, V>> entrySet() Set<K> keySet() Collection<V> values() int size() boolean isEmpty()
  • 274. Collections • Métodos de java.util.Map<K,V>: V put(K key, V value) void putAll(Map<? extends K,? extends V> m) V remove(Object key) void clear() Recupera o valor para a chave V get(Object key) enviada. boolean containsKey(Object o) boolean containsValue(Object o) Set<Map.Entry<K, V>> entrySet() Set<K> keySet() Collection<V> values() int size() boolean isEmpty()
  • 275. Collections • Métodos de java.util.Map<K,V>: V put(K key, V value) void putAll(Map<? extends K,? extends V> m) V remove(Object key) void clear() Verifica se este mapa contém V get(Object key) uma chave significantemente boolean containsKey(Object o) igual ao objeto enviado. boolean containsValue(Object o) Set<Map.Entry<K, V>> entrySet() Set<K> keySet() Collection<V> values() int size() boolean isEmpty()
  • 276. Collections • Métodos de java.util.Map<K,V>: V put(K key, V value) void putAll(Map<? extends K,? extends V> m) V remove(Object key) void clear() Verifica se este mapa contém V get(Object key) uma valor significantemente boolean containsKey(Object o) igual ao objeto enviado. boolean containsValue(Object o) Set<Map.Entry<K, V>> entrySet() Set<K> keySet() Collection<V> values() int size() boolean isEmpty()
  • 277. Collections • Métodos de java.util.Map<K,V>: V put(K key, V value) void putAll(Map<? extends K,? extends V> m) V remove(Object key) void clear() Recupera a coleção Set das V get(Object key) Entry deste mapa. boolean containsKey(Object o) Entry são Entradas do mapa é boolean containsValue(Object o) um objeto que guarda o par Set<Map.Entry<K, V>> entrySet() key-value. Set<K> keySet() Veremos na pagina seguinte Collection<V> values() como funciona essa interface int size() Entry. boolean isEmpty() Alterações nesse Set são refletidas no Map e vice-versa, muito cuidado ao manipular.
  • 278. Collections • Métodos de java.util.Map<K,V>: V put(K key, V value) void putAll(Map<? extends K,? extends V> m) V remove(Object key) void clear() Recupera um Set contendo V get(Object key) todas as chaves do Map. boolean containsKey(Object o) boolean containsValue(Object o) Alterações nesse Set são Set<Map.Entry<K, V>> entrySet() refletidas no Map e vice-versa, Set<K> keySet() muito cuidado ao manipular. Collection<V> values() int size() boolean isEmpty()
  • 279. Collections • Métodos de java.util.Map<K,V>: V put(K key, V value) void putAll(Map<? extends K,? extends V> m) V remove(Object key) void clear() Recupera uma Collection V get(Object key) contendo todos os valores boolean containsKey(Object o) deste Map. boolean containsValue(Object o) Set<Map.Entry<K, V>> entrySet() Alterações nesse Set são Set<K> keySet() refletidas no Map e vice-versa, Collection<V> values() muito cuidado ao manipular. int size() boolean isEmpty()
  • 280. Collections • Métodos de java.util.Map<K,V>: V put(K key, V value) void putAll(Map<? extends K,? extends V> m) V remove(Object key) void clear() Informa a quantidade de pares V get(Object key) key-value existentes neste boolean containsKey(Object o) mapa. boolean containsValue(Object o) Set<Map.Entry<K, V>> entrySet() Set<K> keySet() Collection<V> values() int size() boolean isEmpty()
  • 281. Collections • Métodos de java.util.Map<K,V>: V put(K key, V value) void putAll(Map<? extends K,? extends V> m) V remove(Object key) void clear() Verifica se o Map é vazio V get(Object key) Método de comodidade, o boolean containsKey(Object o) mesmo que (size() == 0) boolean containsValue(Object o) Set<Map.Entry<K, V>> entrySet() Set<K> keySet() Collection<V> values() int size() boolean isEmpty()
  • 282. Collections • Métodos de java.util.Map.Entry<K,V>: K getKey() V getValue() V setValue(V value)
  • 283. Collections • Métodos de java.util.Map.Entry<K,V>: K getKey() //recupera a chave desta entrada V getValue() V setValue(V value)
  • 284. Collections • Métodos de java.util.Map.Entry<K,V>: K getKey() //recupera a chave desta entrada V getValue() //recupera o valor desta entrada V setValue(V value)
  • 285. Collections • Métodos de java.util.Map.Entry<K,V>: K getKey() //recupera a chave desta entrada V getValue() //recupera o valor desta entrada V setValue(V value) //altera o valor para esta chave
  • 286. Collections • A uma interface em maps que também é classificada java.util.SortedMap<K,V>: – Esta interface tem exatamente o mesmo funcionamento da Coleção SortedSet, porém se aplica a parte de Keys do Map
  • 287. Collections • Métodos de java.util.SortedMap<K,V>: Comparator<? super K> comparator() K firstKey() SortedMap<K,V> tailMap(K fromKey) K lastKey() SortedMap<K,V> headMap(K toKey) SortedMap<K,V> subMap(K fromKey, K toKey)
  • 288. Collections • Métodos de java.util.SortedMap<K,V>: Comparator<? super K> comparator() K firstKey() Funciona igual SortedMap<K,V> tailMap(K fromKey) SortedSet para o Set de keys do Map K lastKey() SortedMap<K,V> headMap(K toKey) SortedMap<K,V> subMap(K fromKey, K toKey)
  • 289. Collections • Também existe a interface semelhante a NavigableSet com mais funcionalidades java.util.NavigableMap<K,V>: – Esta interface tem exatamente o mesmo funcionamento da Coleção NavigableSet, porém se aplica a parte de keys do Map
  • 290. Collections • Métodos de java.util.NavigableMap<K,V>: K lowerKey(K key) Entry<K,V> lowerEntry(E key) K floorKey(K e) Entry<K,V> floorEntry(E key) Funciona igual E higherKey(K key) NavigableSet para o Entry<K,V> higherEntry(K key) Set de keys do Map E ceilingKey(K key) Entry<K,V> ceilingEntry(K key) Entry<K,V> pollFirstEntry() Entry<K,V> pollLastEntry() NavigableSet<K> descendingKeySet() NavigableMap<K,V> descendingMap() NavigableMap<K,V> headMap(K toElement, boolean inclusive) NavigableMap<K,V> tailMap(K fromElement, boolean inclusive) NavigableMap<K,V> subMap(K from, boolean inc, K to, boolean inc)
  • 291. Collections • As classes concretas de Map que cai no exame são também muito semelhantes a classes concretas Collection que já estudamos: – Examinamos agora as classes concretas.
  • 294. Collections Hashtable e HashMap Semelhanças: Não ordenadas, não classificadas, baseiam suas buscas em tabelas rash. Diferenças: Hashtable tem todos os seus métodos sincronizados enquanto HashMap não! é aconselhável o uso do HashMap
  • 295. Collections LinkedHashMap Semelhanças: não classificadas, baseiam suas buscas em tabelas rash. Diferenças: A ordem de inserção é levada em conta, e a iteração de seus entrySet(), keySet() ou values() obedecem a ordem de inserção. Obs.: não é sincronizada.
  • 296. Collections TreeMap É um Map classificado onde a ordem dos seus elementos segue a ordem de seu Comparator (se houver) ou a natural de seus elementos. Funciona semelhante a TreeSet.
  • 297. Collections • Vários métodos utilitários podem ser encontrados na classe java.util.Collections, sim Collections com “s” no fim. • Esta classe esta munida das principais operações que você precisará realizar com Coleções, e todos os seus métodos são estáticos. • Sua documentação pode ser encontrada neste link: – http://java.sun.com/javase/6/docs/api/java/util/Collecti ons.html
  • 298. Collections • Vários métodos utilitários podem ser encontrados na classe java.util.Collections, sim Collections com “s” no fim. • Esta classe esta munida das principais operações que você precisará realizar com Coleções, e todos os seus métodos são estáticos. • Sua documentação pode ser encontrada neste link: – http://java.sun.com/javase/6/docs/api/java/util/Collecti ons.html
  • 299. Collections • Vários métodos utilitários podem ser encontrados na classe java.util.Collections, sim Collections com “s” no fim. • Esta classe esta munida das principais operações que você precisará realizar com Coleções, e todos os seus métodos são estáticos. • Sua documentação pode ser encontrada neste link: – http://java.sun.com/javase/6/docs/api/java/util/Collecti ons.html
  • 300. Collections • Existe mais alguma interface ou classe concreta? Da Java Collections Framework ?? – SIM, existe! Mas essas são todas que são usadas no exame. • Onde eu posso encontrar mais informações ? – GUJ: http://www.guj.com.br/ – Sergio Taborda’s Weblog: http://sergiotaborda.wordpress.com/java/colecoes-em-java/ – Tomaz Lavieri’s Blog: http://java-i9se.blogspot.com/ – Tutorial da sun: http://java.sun.com/docs/books/tutorial/collections/index.html – API Specification: http://java.sun.com/javase/6/docs/technotes/guides/collections/referenc e.html – The Java Collection Framework Documentations Contents: http://java.sun.com/javase/6/docs/technotes/guides/collections/index.ht ml
  • 301. Collections • Existe mais alguma interface ou classe concreta? Da Java Collections Framework ?? – SIM, existe! Mas essas são todas que são usadas no exame. • Onde eu posso encontrar mais informações ? – GUJ: http://www.guj.com.br/ – Sergio Taborda’s Weblog: http://sergiotaborda.wordpress.com/java/colecoes-em-java/ – Tomaz Lavieri’s Blog: http://java-i9se.blogspot.com/ – Tutorial da sun: http://java.sun.com/docs/books/tutorial/collections/index.html – API Specification: http://java.sun.com/javase/6/docs/technotes/guides/collections/referenc e.html – The Java Collection Framework Documentations Contents: http://java.sun.com/javase/6/docs/technotes/guides/collections/index.ht ml
  • 302. Collections • Existe mais alguma interface ou classe concreta? Da Java Collections Framework ?? – SIM, existe! Mas essas são todas que são usadas no exame. • Onde eu posso encontrar mais informações ? – GUJ: http://www.guj.com.br/ – Sergio Taborda’s Weblog: http://sergiotaborda.wordpress.com/java/colecoes-em-java/ – Tomaz Lavieri’s Blog: http://java-i9se.blogspot.com/ – Tutorial da sun: http://java.sun.com/docs/books/tutorial/collections/index.html – API Specification: http://java.sun.com/javase/6/docs/technotes/guides/collections/referenc e.html – The Java Collection Framework Documentations Contents: http://java.sun.com/javase/6/docs/technotes/guides/collections/index.ht ml
  • 303. Collections • Existe mais alguma interface ou classe concreta? Da Java Collections Framework ?? – SIM, existe! Mas essas são todas que são usadas no exame. • Onde eu posso encontrar mais informações ? – GUJ: http://www.guj.com.br/ – Sergio Taborda’s Weblog: http://sergiotaborda.wordpress.com/java/colecoes-em-java/ – Tomaz Lavieri’s Blog: http://java-i9se.blogspot.com/ – Tutorial da sun: http://java.sun.com/docs/books/tutorial/collections/index.html – API Specification: http://java.sun.com/javase/6/docs/technotes/guides/collections/referenc e.html – The Java Collection Framework Documentations Contents: http://java.sun.com/javase/6/docs/technotes/guides/collections/index.ht ml
  • 304. Collections • Referencias Bibliográficas: – API Java 6: http://java.sun.com/javase/6/docs/technotes/g uides/collections/reference.html – Livro: Certificação Sun® Para Programador Java 6 – Guia de Estudos – 2° Edição