✅ 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 finaladd(int index, E e): insere no índiceget(int index): recupera o valorremove(Object o)ouremove(int index): remove por valor ou por índicecontains(Object o): verifica existênciasize(): 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
- ArrayList redimensiona automaticamente?
- Sim. Começa com tamanho 10 (por padrão) e dobra quando necessário.
- 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 (null → int).
🔑 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 = nullapenas 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:
ArrayListpode conternull, 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:
ArrayListpermite duplicados. - C está errada:
ArrayListnã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)eremove(Object)têm comportamentos diferentes - Ideal para acesso e iteração frequentes, mas não para inserções no meio com alta performance