O que são Coleções
} São estruturas de dados
} Vetores (listas)
} Conjuntos
} Pilhas
} Árvores binárias
} Tabelas de hash
} Oferecem formas diferentes de colecionar dados com
base em fatores como
} Eficiência no acesso ou na busca ou na inserção
} Forma de organização dos dados
} Forma de acesso, busca, inserção
O que fazer com uma Coleção
} As seguintes operações são básicas para todas as
coleções:
} Adicionar objetos
} Remover objetos
} Descobrir se um objeto ou um grupo de objetos faz parte de
uma coleção
} Recuperar um objeto em uma coleção
} Iterar cada elemento de uma coleção a procura de um objeto
Java Collections API
} Oferece uma biblioteca de classes e interfaces (no
pacote java.util) que
} Implementa as principais estruturas de dados de forma
reutilizável
} Oferece implementações de cursor para iteração (Iterator
pattern) para extrair dados de qualquer estrutura usando uma
unica interface
} Oferece implementações de métodos estáticos utilitários para
manipulação de coleções e vetores
Map, Collection e Collections
} Apesar de ser conhecida como uma Collection, Map não
estende Collection
} Map não é uma Collection
} Interface java.util.Collection
} É a interface estendida por Set e List
} Classe java.util.Collections
} Possui vários métodos utilitários e estáticos para serem usados
com classes
} Referencias
} http://java.sun.com/j2se/1.4.2/docs/guide/collections/
} http://java.sun.com/j2se/1.4.2/docs/api/java/util/Collections.html
} http://java.sun.com/j2se/1.4.2/docs/api/java/util/Collection.html
Exemplos
● Conjunto (interface Set)
- Não pode ter duplicatas
- Os elementos não estão ordenados nem classificados
} Lista (interface List)
} Pode ter duplicatas
} Os elementos estão sempre ordenados
Exemplos
} Tabelas (interface Map)
} Os elementos possuem um identificador único
Coleções Ordenadas e Classificadas
} As coleções podem ser:
} Não-classificadas (unsorted) e não-ordenadas (unordered)
} Ordenadas, mas não-classificadas
} Ambas ordenadas e classificadas
} As coleções nunca serão:
} Classificadas e não ordenadas
} Classificar (sorting) é um tipo específico de ordenamento
(ordering)
Ordenamento
} Quando uma coleção é ordenada, podemos iterar pelos
elementos da coleção de forma ordenada NÃO-aleatória
} Exemplo
} Uma Hashtable não é ordenada, ele possui um algoritmo interno que
determina a ordem de inserção
} Um LinkedHashSet a ordem dos elementos é definida pela ordem de
inserção. Os elementos não podem ser inseridos num índice pre-definido
} Um ArrayList mantém a ordem definida pelo índice do elemento (como nos
arrays). Elementos podem ser inseridos num índice definido pelo
desenvolvedor
Classificação
} Coleções classificadas são ordenadas pelo tipo de
elemento que elas possuem
} Strings são classificados por ordem alfabetica
} Inteiros por ordem numerica
} Outros objetos dependem de implementação
} Se o desenvolvedor desejar implementar a sua ordem ele deve
implementar a classe Comparable
Exemplo
import java.util.*;
public class Ordenado {
public static void main (String[] args) {
LinkedHashSet lhs = new LinkedHashSet();
lhs.add("Cuiaba");
lhs.add("Amazonas");
lhs.add("Joao Pessoa");
lhs.add("São Paulo");
lhs.add("Rio de Janeiro");
printCollection(lhs);
}
}
import java.util.*;
public class Classificado {
public static void main (String[] args) {
TreeSet ts = new TreeSet();
ts.add("Cuiaba");
ts.add("Amazonas");
ts.add("Joao Pessoa");
ts.add("São Paulo");
ts.add("Rio de Janeiro");
printCollection(ts);
}
}
Classificação em Java
} Os objetos são ordenáveis pelo seu conteúdo quando
eles implementam a interface java.util.Comparable;
} A interface comparable define um único método, o
método “compareTo()” que recebe um único parâmetro
e retorna um inteiro:
} Ele deve retornar -1 quando o objeto passado como parâmetro
for maior que o objeto atual;
} 0 se ambos os objetos são equivalentes;
} E 1 se o objeto passado como parâmetro for menor que o
objeto atual;
List
} As listas possuem controle o índice, a unica diferença da lista
para as outras coleções são os métodos de controle de indice
} get(int index), indexOf(), add(int index, Object obj), etc
} Implementações de List
} ArrayList
} Considerado um array que pode crescer além da sua capacidade
inicial
} Vector
} Possui o mesmo comportamento do ArrayList, mas os seus métodos
são todos synchronized para acesso multi-thread
} LinkedList
} Os elementos são duplamente ligados uns aos outros
} Isso permite adição ou remoção no inicio ou fim da lista
Set
} Os conjuntos não permitem duplicatas. Isto é verificado
pelo equals de cada elemento
} Implementações de Set
} HashSet
} É um conjunto não-classificado e não-ordenado. Utiliza o hashCode()
de cada objeto
} LinkedHashSet
} É uma versão ordenada do HashSet
} TreeSet
} É uma versão classificada do HashSet
Map
} Map oferece identificadores únicos (chaves) para cada elemento
} Implementações de Map
} HashMap
} Oferece uma estrutura não-classificada e não-ordenada
} Hashtable
} Possui o mesmo comportamento do HashMap, mas os seus métodos são
todos synchronized para acesso multi-thread
} LinkedHashMap
} Mantém a ordem de inserção dos elementos
} TreeMap
} Estrutura classificada de Map
} Pode-se passar um Comparator em seu construtor para se
classificar os elementos
Percorrendo uma Coleção
} Para se percorrer uma coleção usamos o Iterator
HashMap map = new HashMap();
map.put("um", new Coisa("um"));
map.put("dois", new Coisa("dois"));
map.put("tres", new Coisa("tres"));
(...)
Iterator it = map.values().iterator();
while(it.hasNext()) {
Coisa c = (Coisa)it.next();
System.out.println(c);
}
O que é um iterator?
} É um padrão de projeto que define a criação de um
objeto que sabe navegar em uma coleção, de forma que a
implementação da coleção fique transparente para quem
a usar;
} Os iterators em Java são implementações da interface
java.util.Iterator;
} Todas as classes que implementam a interface Collection
tem um método que retorna um Iterator para elas;
Exemplo de List
} List possui um ListIterator, que pode acessar o inicio,
priximo, ou o fim da lista
List lista = new ArrayList();
lista.add(new Coisa("um"));
lista.add(new Coisa("dois"));
lista.add(new Coisa("tres"));
(...)
Coisa c3 = lista.get(2); // == índice de vetor
ListIterator it = lista.listIterator();
Coisa c = it.last();
Coisa d = it.previous();
Coisa[] coisas =
(Coisa[])list.toArray(new Coisa[lista.size()]);
Set Exemplo
} Os conjuntos não permitem duplicatas
} O trecho de código abaixo imprime: um, dois, tres
Set conjunto = new HashSet();
conjunto.add("um");
conjunto.add("dois");
conjunto.add("tres");
conjunto.add("um");
conjunto.add("um");
Iterator it = conjunto.iterator();
while(it.hasNext()) {
System.out.println(it.next());
}
Map Exemplo
} Maps possuem chaves e valores
Map map = new HashMap();
map.put("um", new Coisa("um"));
map.put("dois", new Coisa("dois"));
(...)
Set chaves = map.keySet();
Collection valores = map.values();
(...)
Coisa c = (Coisa) map.get("dois");
(...)
Set pares = map.entrySet();
Iterator entries = pares.iterator();
Map.Entry one = entries.next();
String chaveOne = (String)one.getKey();
Coisa valueOne = (Coisa)one.getValue();
Which collection class allows you to grow or shrink
its size and provides indexed access to its
elements, but whose methods are not synchronized?
A. java.util.HashSet
B. java.util.LinkedHashSet
C. java.util.List
D. java.util.ArrayList
E. java.util.Vector
Given the following,
12. TreeSet map = new TreeSet();
13. map.add("one");
14. map.add("two");
15. map.add("three");
16. map.add("four");
17. map.add("one");
18. Iterator it = map.iterator();
19. while (it.hasNext() ) {
20. System.out.print( it.next() + " " );
21. }
what is the result?
A. one two three four
B. four three two one
C. four one three two
D. one two three four one
E. one four three two one
F. The print order is not guaranteed.
Which collection class allows you to associate its
elements with key values, and allows you to
retrieve objects in FIFO (first-in, first-out) sequence?
A. java.util.ArrayList
B. java.util.LinkedHashMap
C. java.util.HashMap
D. java.util.TreeMap
E. java.util.LinkedHashSet
F. java.util.TreeSet