Collections

Aula
Estado
  • Não é possível criar uma coleção de primitivos; já que coleções utilizam Genercis e essas não aceitam primitivos
  • Expandem automáticamente
  • Ela é preenchida automaticamente com null

Interfaces

💡
Você deve utilizar uma Interface para especificar o tipo da variável, não a Classe
  • Iterable
  • Collection
  • List
  • Set
  • SortedSet
  • Deque (double-ended queue)
  • Map: contem um Set de chaves únicas e uma List de valores

ArrayList

💡
É recomendado passar um tamanho inicial para evitar muita cópia de elementos
  • Seu tamanho inicial padrão é 10, mas é possível defini-lo no construtor
  • Pode receber outra coleção no seu construtor para preenche-la
  • É possível gerar uma instância de tamanho fixo com Arrays.asList(...)
  • É possível gerar uma instância read-only com List.of(...)
  • É recomendado passar um tamanho inicial para evitar muita cópia de elementos

HashSet

💡
Um HashSet armazena apenas os Hashes de seus elementos. Ele divide esses Hashes em grupos de elementos com Hashes similares. Isso permite que seu algoritmo de inserção itere apenas nos elementos de um grupo ao evitar elementos duplicados.
  • Load factor: é uma porcentagem de quanto da capacidade de um grupo do Set pode ser preenchida antes de ela ser aumentada
  • Seu tamanho inicial padrão é 16, mas é possível defini-lo no construtor
  • Pode receber outra coleção no seu construtor para preenche-la
  • Load Factor padrão é o 0.75; podendo ser alterado no construtor
  • Ao adicionar um elemento duplicado a chamada hashSet.add(5) irá retornar o booleano false

Deque

  • Uma coleção que implementa comportamentos FIFO e LIFO
  • Não é possível adicionar elementos nulos
  • O método offerFirst() adiciona um elemento à primeira posição da coleção, "empurrando" os outros elementos em direção a última
  • O método offerLast() adiciona um elemento à após o último elemento não-nulo da coleção (pode ser que seja a primeira posição, se não houver nenhum item na coleção)
  • O método pollFirst() retorna e remove o primeiro elemento não-nulo da coleção
  • O método pollLast() retorna e remove o último elemento não-nulo da coleção
  • O método peekFirst() retorna o primeiro elemento não-nulo da coleção sem removê-lo
  • O método peekLast() retorna o último elemento não-nulo da coleção sem removê-lo

HashMap

💡
É como uma tabela com duas colunas. A primeira coluna "key" não aceita valores repetidos. A segunda coluna "value" aceita valores repetidos.
  • Seu tamanho inicial padrão é 16, mas é possível defini-lo no construtor
  • Pode receber outro Map no seu construtor para preenche-la
  • Load Factor padrão é o 0.75; podendo ser alterado no construtor
  • É possível gerar uma instância read-only com Map.of(...) ou Map.ofEntries(Map.entry<key, value>...); sendo ofEntries levemente mais performático

Iteration

  • Utilizando o forEach loop
  • Criando uma instância de Iterator, a partir de de uma coleção Iterator<Product> = productSet.iterator();

Alguns métodos de Collection

  • O método collection.toArray(T[] arr) retorna um array contendo os elementos da coleção que forem do mesmo tipo que o array passado por parâmetro
    • Se a variável que recebe o retorno de toArray tiver capacidade inferior à necessária, uma nova instância de array é atribuída
List<Product> itens = new ArrayList<>(); itens.add(new Food("Cake")); itens.add(new Drink("Wine")); itens.add(new Drink("Beer")); Drink[] drinks = new Drink[4]; // apenas as instâncias de Drink irão estar em // filteredProducts Drink[] filteredProducts = itens.toArray(drinks);
  • O método collection.removeIf(Predicate filter) recebe uma instância de classe que implemente a interface Predicate. A interface Predicate declara um método test que retorna um booleano e pode ser sobrescrito para criar um filtro de remoção

A Classe Collections

Essa classe provê alguns métodos úteis para lidar com coleções. Ajudando em operações como:
  • preencher coleções (fill)
  • buscar em uma coleção de objetos com a interface Comperable ou usando um Comparator (binarySearch)
  • ordenar uma coleção (sort)
  • embaralhar uma coleção (shuffle)
  • inverter a ordem dos elementos de uma coleção (reverse)

Acesso Simultâneo a Coleções

  • Se duas threads acessarem a mesma coleção, ao mesmo tempo, seu código pode ser corrompido; a não ser que essa coleção seja imutável
  • Tornar uma coleção imutável, não garante segurança de processos concorrentes para os objetos que ela contêm; apenas objetos que sejam imutáveis são seguros nesse cenário
  • É possível prevenir a corrupção de coleções:
    • tornando a coleção read-only
    • criando uma coleção synchronized (lento e não-escalável)
    • criando uma coleção Copy-on-write (rápido mas consome memória)
notion image

Legacy Classes

Foram substituídas por serem synchronized por padrão, causando problemas de performance. As novas classes permitem ainda que o acesso seja sincronizado, porém é opcional — recomendado apenas para casos de acesso concorrente e sob análise, devido a sua lentidão.
  • ArrayList era Vector
  • HashMap era Hastable