Você está na página 1de 17

API de Collections de Java

Lists, Sets e Maps


Programação Aplicada
Bruno Cartaxo
http://brunocartaxo.com/teaching
bruno.cartaxo@olinda.ifpe.edu.br
Arrays em Java
• Até o momento arrays são o único tipo de estrutura que permite
armazenar vários dados em em conjunto.

• Mas arrays tem alguns problemas:


• Não podemos redimensioná-los
• Impossível buscar diretamente por um elemento cujo índice não se sabe
• Não conseguimos saber quantas posições do array já foram populadas

• Por isso o Java possui uma API com vários tipos de estruturas de
dados focados em resolver problemas distintos
API de Collections de Java
Hierarquia de Collections

<<Interface>>
Collection <<Interface>>
Map

<<Interface>> <<Interface>>
List Set

<<Classe Concreta>>
HashMap
<<Classe Concreta>> <<Classe Concreta>>
ArrayList HashSet
Lists (Listas)
• Uma lista é uma coleção que permite elementos duplicados e mantém uma
ordenação específica entre os elementos.

• A API de Collections traz a interface java.util.List, que especifica o


que uma classe deve ser capaz de fazer para ser uma lista.

• A implementação mais utilizada da interface List é a ArrayList


• Trabalha como um array interno para gerar uma lista.

• Outra implementação é a LinkedList


Declarando e Instanciando Listas
Para criar um ArrayList, basta chamar o construtor:
ArrayList<String> lista = new ArrayList<String>();

É possível abstrair a lista a partir da interface List:


List<String> lista = new ArrayList<String>();

• Note que, em momento algum, definimos o tamanho da lista


• Podemos acrescentar quantos elementos quisermos, que a lista cresce
conforme for necessário
Usando Listas
• Para criar uma lista de nomes (String), podemos fazer:
ArrayList<String> lista = new ArrayList<String>();
lista.add("Manoel");
lista.add("Joaquim");
lista.add("Maria");

• Para saber quantos elementos há na lista, usamos o método


lista.size();

• O método lista.get(i) é usado para obter o item armazenado na


posição i da lista:
lista.get(1); // Joaquim
Sets (Conjuntos)
• Um Set funciona de forma análoga aos conjuntos da matemática, ele é uma
coleção que não permite elementos duplicados

• Outra característica é que Sets não garantem uma ordenação específica, ao


contrário das listas.

• Um conjunto é representado pela interface Set e tem como suas principais


implementações as classes:
• HashSet
• LinkedHashSet
• TreeSet
Declarando e Instanciando Sets
Para criar um HashSet, basta chamar o construtor:
HashSet<Integer> numeros = new HashSet<Integer>();

É possível abstrair o set a partir da interface Set:


Set<Integer> numeros = new HashSet<Integer>();

• Assim como com as listas, não definimos o tamanho do Set


• Podemos acrescentar quantos elementos quisermos, que o Set cresce
conforme for necessário
Usando Sets
• O código a seguir cria um conjunto e adiciona diversos elementos, e
alguns repetidos:
HashSet<String> cargos = new HashSet<String>();

cargos.add("Gerente");
cargos.add("Diretor");
cargos.add("Presidente");
cargos.add("Secretária");
cargos.add("Funcionário");
cargos.add("Diretor"); // repetido!
Varrendo coleções com o ForEach
• Como percorrer os elementos de uma coleção?
• Com Lists podemos usar um laço fore chamar o método get para cada
elemento. Mas e com o Set, que não tem noção de ordem?
• A partir do Java 5 temos o ForEach:
HashSet<String> cargos = new HashSet<String>();
cargos.add("Gerente");
cargos.add("Diretor");
cargos.add("Presidente");
cargos.add("Secretária");
cargos.add("Funcionário");
cargos.add("Diretor"); // repetido!

for (String cargo : cargos) {


System.out.println(cargo);
}
Maps (Mapas)
• Muitas vezes queremos buscar rapidamente um objeto dado alguma informação
sobre ele.
• Um exemplo seria, dada a placa do carro, obter todos os dados do carro.
• Poderíamos utilizar uma lista para isso e percorrer todos os seus elementos, mas isso pode
ser péssimo para a performance, mesmo para listas não muito grandes

• Um mapa é composto por um conjunto de associações entre um objeto chave a


um objeto valor

• java.util.Map é um mapa, pois é possível usá-lo para mapear uma chave a um


valor

• Suas principais implementações são: HashMap, TreeMap, Hashtable


Declarando e instanciando Maps
• Para criar e instanciar um HashMap basta chamar o construtor:
HashMap<String, Double> salarios = new HashMap<String, Double>();

• É possível abstrair o map a partir da interface Map:


Map<String, Double> salarios = new HashMap<String, Double>();

• Assim como com as lists e sets, não definimos o tamanho do Map


• Podemos acrescentar quantos elementos quisermos, que o Map cresce
conforme for necessário
Usando Maps
• O método put(Object, Object) da interface Map recebe a chave e o
valor de uma nova associação.

• Para saber o que está associado a um determinado objeto-chave,


passa-se esse objeto no método get(Object).
HashMap<String, Double> salarios = new HashMap<String, Double>();
salarios.put("diretor", 10000.0);
salarios.put("gerente", 5000.0);

System.out.println("Salario do diretor: " + salarios.get("diretor"));


Equals e HashCode
• Muitas das coleções do java guardam os objetos dentro de tabelas de hash. Essas tabelas são
utilizadas para que a pesquisa de um objeto seja feita de maneira rápida.

• Como funciona? Cada objeto é “classificado” pelo seu hashCode e, com isso, conseguimos espalhar
cada objeto agrupando-os pelo hashCode. Quando buscamos determinado objeto, só vamos
procurar entre os elementos que estão no grupo daquele hashCode. Dentro desse grupo, vamos
testando o objeto procurado com o candidato usando equals().

• Para que isso funcione direito, o método hashCode de cada objeto deve retornar o mesmo valor
para dois objetos, se eles são considerados equals. Em outras palavras:
a.equals(b) implica a.hashCode() == b.hashCode()

• Implementar hashCode de tal maneira que ele retorne valores diferentes para dois objetos
considerados equals quebra o contrato de Object e resultará em collections que usam
espalhamento (como HashSet, HashMap e Hashtable), não achando objetos iguais dentro de uma
mesma coleção.
Referências da aula
• Adaptado da Apostila da Caelum. Java e Orientação a Objetos: Curso
FJ-11. Acessível em:
https://www.caelum.com.br/download/caelum-java-objetos-fj11.pdf
API de Collections de Java
Lists, Sets e Maps
Programação Aplicada
Bruno Cartaxo
http://brunocartaxo.com/teaching
bruno.cartaxo@olinda.ifpe.edu.br

Você também pode gostar