- 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(...)
ouMap.ofEntries(Map.entry<key, value>...)
; sendoofEntries
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 interfacePredicate
. A interfacePredicate
declara um métodotest
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 umComparator
(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)

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
eraVector
HashMap
eraHastable