Sets, Queues

Tipos de Dados e Exceções em Java

Jim White

Java Developer

Interface Set

  • Set também é um tipo de Collection
    • Não permite objetos duplicados
      • Garante que cada elemento seja único
    • Objetos Set são, em geral, não ordenados (portanto, sem índice)
  • Lists são como uma caixa de pílulas; cada objeto fica em um lugar específico
  • Sets são como um saco com objetos; eles ficam ali de forma aleatória

Listas são como organizadores de pílulas, com objetos armazenados por índice em um local específico

Sets são como sacos que mantêm objetos aleatórios e sem ordem

1 Imagens cortesia da Wikimedia Commons
Tipos de Dados e Exceções em Java

List vs Set

  • Quando usar um Set
    • Garante a unicidade dos elementos
    • Mais rápido para buscas
      • Verificar se um objeto está em um Set
    • Mais eficiente em memória conforme a coleção cresce
    • Bom para testar pertencimento em caches
      • Exemplo: encontrar palavras únicas em um documento
Tipos de Dados e Exceções em Java

List vs Set

  • Quando usar uma List
    • Preserva a ordem e permite duplicatas
    • Melhor para acesso por posição
    • Melhor para adicionar/remover por índice
    • Útil quando a ordem importa
      • Ex.: gerenciar passos de uma sequência ou músicas de uma playlist
Tipos de Dados e Exceções em Java

Implementação de Set

  • Muitas implementações de Set
    • HashSet é uma implementação popular
  • HashSet
    • Um saco não ordenado de objetos
    • Mais rápido que outras implementações de Set para inserir, remover e buscar
    • Geralmente usa mais memória que outras implementações de Set
    • Permite armazenar um único null

HashSet são sacos não ordenados de objetos permitindo um null

Tipos de Dados e Exceções em Java

Construção de HashSet

  • Use o construtor genérico parametrizado para criar um HashSet
    HashSet<String> set = new HashSet<String>();
    
  • HashSet está no pacote java.util
    • Requer um import
    • import java.util.HashSet
Tipos de Dados e Exceções em Java

Métodos de HashSet

  • Use .add() e .remove() para adicionar e remover objetos
  • Use .remove() e depois .add() para substituir um objeto
  • Use .contains() para verificar se o objeto já existe
  • Duplicatas são ignoradas
  • Permite null
  • Ordem não é garantida
set.add("France");
set.add("Japan");
set.add("Brazil");
set.add("Egypt");
set.add(null); // null é permitido
set.remove("Brazil");
boolean z =
  set.contains("France"); // z é true
set.add("Japan"); // Ignorado
System.out.println(set);
[null, Japan, Egypt, France]
Tipos de Dados e Exceções em Java

Interface Queue

  • A estrutura Queue processa objetos em ordem first in, first out (FIFO)
    • O primeiro a entrar é o primeiro a sair
    • Como a fila de uma bilheteria
    • Tem um head e um tail

Imagem de uma fila com head (início) e tail (fim) identificados

  • Várias implementações de Queue
    • Comportamento e operações semelhantes
Tipos de Dados e Exceções em Java

ArrayBlockingQueue

  • Implementação popular de Queue
    • Um array por baixo dos panos
  • Atenção: ArrayBlockingQueue está no pacote java.util.concurrent
    • Não está em java.util
Tipos de Dados e Exceções em Java

Construção de ArrayBlockingQueue

  • Use o construtor genérico parametrizado para criar uma ArrayBlockingQueue
    • Tem uma capacidade (limite de objetos) definida no construtor
import java.util.concurrent;  // No topo da classe

// Cria uma fila que armazena 4 Strings
ArrayBlockingQueue<String> queue = new ArrayBlockingQueue<String>(4);
Tipos de Dados e Exceções em Java

Métodos de ArrayBlockingQueue

  • Use .add(object) ou .offer(object) para adicionar no tail
    • .add(object) lança exceção quando a Queue está cheia
    • .offer(object) ignora o novo objeto quando está cheia
ArrayBlockingQueue<String> queue 
    = new ArrayBlockingQueue<String>(4);
queue.offer("France");
queue.offer("Japan");
queue.offer("Brazil");
queue.offer("Egypt");
queue.offer("China"); // Ignora China

// Causa IllegalStateException
// queue.add("China");

System.out.println(queue);
[France, Japan, Brazil, Egypt]
Tipos de Dados e Exceções em Java

Métodos de ArrayBlockingQueue

  • Use .remove() ou .poll() para remover do head
    • .remove() lança exceção quando a Queue está vazia
    • .poll() retorna null quando a Queue está vazia
  • Não permite null
ArrayBlockingQueue<String> queue 
    = new ArrayBlockingQueue<String>(4);
String x = queue.poll(); // x é null
// Causa NoSuchElementException
// String y = queue.remove();

queue.offer("France");
String next = queue.poll();
System.out.println(next);
France
Tipos de Dados e Exceções em Java

Vamos praticar!

Tipos de Dados e Exceções em Java

Preparing Video For Download...