🚂Crie e use objetos ArrayList

✅ O que é ArrayList?

ArrayList é uma implementação da interface List baseada em array dinâmico, que permite elementos duplicados, mantém a ordem de inserção, e é resizable (ou seja, seu tamanho cresce conforme adicionamos elementos).

✅ Declaração e criação

List<String> nomes = new ArrayList<>();
ArrayList<Integer> numeros = new ArrayList<>(20);

Linha 1: Criação com tipo genérico, usando a interface List

Linha 2: Define capacidade inicial, mas o tamanho lógico ainda é 0

✅ Métodos principais

ArrayList<String> lista = new ArrayList<>();
lista.add("Java");
lista.add("Python");
lista.add(1, "C++");
System.out.println(lista.get(0));
System.out.println(lista.indexOf("Python"));
lista.remove("C++");
System.out.println(lista.contains("Java"));
System.out.println(lista.size());

✍️ Comentários:

  • add(E e): adiciona ao final
  • add(int index, E e): insere no índice
  • get(int index): recupera o valor
  • remove(Object o) ou remove(int index): remove por valor ou por índice
  • contains(Object o): verifica existência
  • size(): retorna a quantidade de elementos

🔸Abaixo está o código com exemplos de uso de ArrayList:

import java.util.*;

public class ColecoesExemplos {

  public static void main(String[] args) {

    //🔸ArrayList
    List<String> lista = new ArrayList<>();
    lista.add("Maçã");
    lista.add("Banana");
    lista.add("Laranja");
    System.out.println(lista);

}

Cria uma ArrayList de Strings e adiciona três elementos.
🔸A lista preserva a ordem de inserção e permite duplicatas.

✅ Iterando ArrayList

ArrayList<String> nomes = new ArrayList<>();
nomes.add("Ana");
nomes.add("Bea");
nomes.add("Leo");

for (String nome : nomes) {
  System.out.println(nome);
}

nomes.forEach(System.out::println);

Iterator<String> it = nomes.iterator();
while (it.hasNext()) {
  System.out.println(it.next());
}

✅ Conversão para array

ArrayList<String> linguagens = new ArrayList<>();
linguagens.add("Java");
linguagens.add("C#");

String[] array = linguagens.toArray(new String[0]);
//Converte o ArrayList para um array fixo.

❌ Exemplos Incorretos com Explicações

💥Tipagem errada com ArrayList:

List<Integer> lista = new ArrayList<>();
lista.add("texto"); // erro de compilação

Erro: Como a lista foi criada com o tipo Integer então não vai ser possível adicionar um elemento do tipo String.

💥Usar índice inválido

ArrayList<String> list = new ArrayList<>();
list.add("A");
list.get(1);

Comentário: IndexOutOfBoundsException, pois só existe o índice 0.

💥Confundir remove(int) com remove(Object)

ArrayList<Integer> numeros = new ArrayList<>();
numeros.add(1);
numeros.add(2);
numeros.remove(1);

Comentário: Remove o valor no índice 1 (ou seja, o número 2).

Para remover o número 1 como valor, precisa usar: numeros.remove(Integer.valueOf(1));

💥Autoboxing mal interpretado

ArrayList<Integer> lista = new ArrayList<>();
lista.add(0);
lista.add(1);
lista.remove(1);

Comentário: Remove o elemento no índice 1 (1), não o valor 1!

🧩 Dicas de prova

  1. ArrayList redimensiona automaticamente?
    • Sim. Começa com tamanho 10 (por padrão) e dobra quando necessário.
  2. Autoboxing e null podem causar NullPointerException
ArrayList<Integer> lista = new ArrayList<>();
lista.add(null);
int valor = lista.get(0); // autoboxing aqui

🟡 Pegadinha:
Vai lançar NullPointerException, porque null não pode ser desempacotado (nullint).

🔑 Dica:
Evite usar primitivos diretamente ao acessar elementos que podem ser null.

3. ArrayList permite elementos null

ArrayList<String> lista = new ArrayList<>();
lista.add(null);
System.out.println(lista.get(0)); // imprime null

🔑 Dica:
ArrayList permite elementos null.

4. Iterar e modificar ao mesmo tempo pode causar ConcurrentModificationException

ArrayList<String> lista = new ArrayList<>();
lista.add("A");
lista.add("B");

for (String s : lista) {
// ConcurrentModificationException
  lista.remove(s); 
}

🟡 Pegadinha:
Modificar a lista durante um for-each lança exceção.

🔑 Dica:
Use Iterator com .remove() se precisar remover enquanto itera:

Iterator<String> it = lista.iterator();
while (it.hasNext()) {
  it.next();
  it.remove();
}

5. Aumento de capacidade é automático, mas não garante eficiência

ArrayList<String> lista = new ArrayList<>();
for (int i = 0; i < 1000; i++) {
  lista.add("item " + i);
}

🔑 Dica:
O ArrayList cresce automaticamente, mas cresce cópia por cópia de array, o que pode afetar desempenho.

🟡 O que fazer?
Se souber o tamanho esperado, use:

new ArrayList<>(1000);

⌛Hora do Simulado – ArrayList

🧩 Clique na pergunta para ver resposta, tente resolver antes.
1️⃣Qual opção remove todos os elementos de uma ArrayList?
  • Resposta: A
  • clear() remove todos os elementos.
  • removeAll() precisa de uma coleção como argumento (lista.removeAll(outraLista)).
  • delete() não existe.
  • lista = null apenas muda a referência, não esvazia a lista original.

A) lista.clear()
B) lista.removeAll()
C) lista.delete()
D) lista = null

2️⃣O que acontece ao executar o código abaixo?

Resposta: B
remove(“Python”) remove o objeto “Python” da lista.
Resultado: [Java]
Não lança exceção! O método remove(Object o) simplesmente retorna true ou false se encontrou ou não o elemento.

List<String> lista = new ArrayList<>();
lista.add("Java");
lista.add("Python");
lista.remove("Python");
System.out.println(lista);

A) [Java, Python]
B) [Java]
C) []
D) Lança exceção

3️⃣Qual o erro do seguinte código?

Resposta: B

Após o add(0, "A"), a lista tem 1 elemento.

Não existe posição 2 ainda → isso causa IndexOutOfBoundsException.

Para adicionar em uma posição específica, ela precisa já existir ou ser a próxima válida (size() ou menor).

List<String> lista = new ArrayList<>();
lista.add(0, "A");
lista.add(2, "C");

A) Nenhum, código compila e roda
B) IndexOutOfBoundsException
C) NullPointerException
D) IllegalArgumentException

4️⃣O que acontece com o código abaixo?

Resposta: C
Explicação:
remove(10) é interpretado como remove(int index), então ele tenta remover o elemento no índice 10.
– Como só existem dois elementos (índices 0 e 1), o índice 10 é inválido.
-⚠️ Pegadinha clássica: se você quer remover o valor 10, use lista.remove(Integer.valueOf(10));

ArrayList<Integer> lista = new ArrayList<>();
lista.add(10);
lista.add(20);
lista.remove(10);
System.out.println(lista);

A) Compila e remove o número 10
B) Compila e remove o valor no índice 10
C) Lança IndexOutOfBoundsException
D) Lança NullPointerException

5️⃣Qual das alternativas é verdadeira?
  • Resposta: A
  • Explicação:
  • ArrayList pode conter null, mas só funciona com tipos de referência (ex: String, Integer, etc).
  • Tipos primitivos (int, double, etc) não podem ser usados diretamente em genéricos.
  • As outras opções:
  • D está errada: capacidade inicial é opcional.
  • B está errada: ArrayList permite duplicados.
  • C está errada: ArrayList não é thread-safe.

A) ArrayList permite null apenas se usar tipos de referência
B) ArrayList não pode conter elementos duplicados
C) ArrayList é thread-safe
D) ArrayList exige capacidade inicial igual ao tamanho dos dados

Resumo: ArrayList

🔸 ArrayList

  • Estrutura de lista dinâmica.
  • Mantém a ordem de inserção.
  • Permite valores duplicados e null.
  • Acesso por índice é rápido (get(index)).
  • Usa array interno redimensionável
  • Não é sincronizado (não thread-safe)
  • ⚠️ Métodos remove(int) e remove(Object) têm comportamentos diferentes
  • Ideal para acesso e iteração frequentes, mas não para inserções no meio com alta performance

Deixe um comentário