Java Array List
Java Array List
ENTRAR MATRICULE-SE
0:00 / 24:01
Conhecer a API de Collections é algo mais que essencial para o desenvolvedor Java. Elas
estão em todos os lugares, você utilizando ou não.
Dentre elas, a ArrayList é a que aparece com maior frequência. Antes de chegarmos em
toda a hierarquia das tais "Collections", vamos praticar bastante as operações essenciais
das listas, mais especificamente essa implementação. O que são exatamente as
Collections? Vai ficar mais claro no decorrer do curso. Pense nelas como classes que
ajudam você a manipular um punhado de objetos.
https://www.alura.com.br/conteudo/java-collections 1/26
08/06/2020 Java: Dominando as Collections | Alura Cursos Online
Para esse curso você estará o tempo todo importando classes e interfaces do pacote
java.util, fique atento! Caso contrário você pode acabar importando classes de outros
pacotes que possuem o mesmo nome.
import java.util.List;
import java.util.ArrayList;
System.out.println(aulas);
}
}
https://www.alura.com.br/conteudo/java-collections 2/26
08/06/2020 Java: Dominando as Collections | Alura Cursos Online
Qual é o resultado desse código? Ele mostra as aulas adicionadas em sequência! Por que
isso acontece? Pois a classe ArrayList, ou uma de suas mães, reescreveu o método
toString, para que internamente fizesse um for, concatenando os seus elementos
internos separados por vírgula.
Removendo elementos
Bastante simples! O que mais podemos fazer com uma lista? As operações mais básicas
que podemos imaginar, como por exemplo remover um determinado elemento. Usamos o
método remove e depois mostramos o resultado para ver que a primeira foi removida:
aulas.remove(0);
System.out.println(aulas);
Por que 0? Pois as listas, assim como a maioria dos casos no Java, são indexadas a partir
do 0, e não do 1.
Bem, talvez não seja a melhor das ideias fazer um System.out.println na nossa lista,
pois talvez queiramos mostrar esses itens de alguma outra forma, como por exemplo um
por linha. Como fazer isso? Utilizando o for de uma maneira especial, chamada de
enhanced for, ou popularmente foreach. Lembrando que foreach não existe no Java
como comando, e sim como um caso especial do for mesmo. Olhe o código:
Acessando elementos
E se eu quisesse saber apenas a primeira aula? O método aqui é o get. Ele retorna o
primeiro elemento se passarmos o 0 como argumento:
https://www.alura.com.br/conteudo/java-collections 3/26
08/06/2020 Java: Dominando as Collections | Alura Cursos Online
Você pode usar esse mesmo método para percorrer a lista toda, em vez do tal do enhanced
for. Para isso, precisamos saber quantos elementos temos nessa lista. Nesse caso,
utilizamos o método size para limitar o nosso for:
Fizemos até i < aulas.size() pois size retorna o total de elementos. Se acessássemos
até i <= aulas.size() teríamos um problema! Uma exception do tipo
IndexOutOfBoundsException seria lançada! Quer ver? Vamos imprimir o size e faça o
teste com o código que temos até aqui:
import java.util.List;
import java.util.ArrayList;
System.out.println(aulas);
System.out.println(aulas.size());
https://www.alura.com.br/conteudo/java-collections 4/26
08/06/2020 Java: Dominando as Collections | Alura Cursos Online
Percorrer com o enhanced for é uma forma bastante indicada. Já o for que fizemos
utilizando o get possui alguns problemas que veremos em uma próxima aula e vai ficar
bastante claro.
Uma outra forma de percorrer nossa lista é utilizando as sintaxes e métodos novos
incluídos no Java 8. Temos um método (não um comando!) agora que se chama forEach.
Ele recebe um objeto do tipo Consumer, mas o interessante é que você não precisa criá-lo,
você pode utilizar uma sintaxe bem mais enxuta, mas talvez assustadora a primeira vista,
chamada lambda. Repare:
aulas.forEach(aula -> {
System.out.println("Percorrendo:");
System.out.println("Aula " + aula);
});
Estranho não? Lambda não é o foco desse curso. Existe um curso no Alura que vai tratar
apenas desse assunto e é bastante aconselhado. Aqui estamos falando que, para cada
String aula, determinado bloco de código deve ser executado. Essa variável aula
poderia ter o nome que você desejasse.
Ordenando a lista
Collections.sort(aulas);
Simples, não? Mas há bastante mágica ocorrendo aqui por trás. Como é que essa classe
sabe ordenar listas de Strings? E se fosse uma lista de, digamos, Aula, também
funcionaria? Segure um pouco essas questões e por enquanto vamos fechar esta aula
testando esse simples código final:
https://www.alura.com.br/conteudo/java-collections 5/26
08/06/2020 Java: Dominando as Collections | Alura Cursos Online
import java.util.List;
import java.util.ArrayList;
import java.util.Collections;
class TestandoListas {
System.out.println(aulas);
Collections.sort(aulas);
System.out.println("Depois de ordenado:");
System.out.println(aulas);
}
}
A implementação ArrayList.
O pacote java.util.
ForEach do Java 8.
https://www.alura.com.br/conteudo/java-collections 6/26
08/06/2020 Java: Dominando as Collections | Alura Cursos Online
0:00 / 19:00
Trabalhar com uma lista de Strings foi fácil. E se for de uma classe que nós mesmos
criamos? Faz diferença?
Vamos criar uma classe Aula que possui um titulo e o tempo em minutos. Um construtor
populará esses atributos. Nem vamos colocar setters, já que não temos essa necessidade
por enquanto:
https://www.alura.com.br/conteudo/java-collections 7/26
08/06/2020 Java: Dominando as Collections | Alura Cursos Online
}
}
System.out.println(aulas);
}
}
Qual será o resultado? O nome das três aulas? Na verdade, não. O método toString da
classe ArrayList percorre todos os elementos da lista, concatenando seus valores
também de toString. Como a classe Aula não possui um toString reescrito (_override_),
ele utilizará o toString definido em Object, que retorna o nome da classe, concatenado
com um @ e seguido de um identificador único do objeto. Algo como:
Se a sua classe Aula estiver dentro de um pacote , e deveria estar, a saída será
br.com.alura.Aula@c3bfe4, pois o _full qualified name_, ou _nome completo da
classe_, é sempre o nome do pacote concatenado com . e o nome curto da classe.
https://www.alura.com.br/conteudo/java-collections 8/26
08/06/2020 Java: Dominando as Collections | Alura Cursos Online
Vamos então reescrever nosso método toString da classe Aula, para que ele retorne algo
significativo:
@Override
public String toString() {
return "[Aula: " + this.titulo + ", " + this.tempo + " minutos]";
}
}
Confira nosso código completo, que você pode fazer pequenas modificações e testar,
inclusive removendo o toString por completo:
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
System.out.println(aulas);
}
}
https://www.alura.com.br/conteudo/java-collections 9/26
08/06/2020 Java: Dominando as Collections | Alura Cursos Online
@Override
public String toString() {
return "[Aula: " + this.titulo + ", " + this.tempo + " minutos]";
}
}
E se tentássemos adicionar uma String, em vez de uma Aula, dentro dessa lista, o que
aconteceria? Faça o teste!
https://www.alura.com.br/conteudo/java-collections 10/26
08/06/2020 Java: Dominando as Collections | Alura Cursos Online
Mas como ele saberia então ordenar uma List<String>? Será que há um código
específico dentro de sort que verifica se a lista é de Strings? Certamente não.
String s1 = "paulo";
String s2 = "silveira";
int resultado = s1.compareTo(s2);
System.out.println(resultado);
}
}
O resultado da comparação é um int, pois um boolean não bastaria. Esse método devolve
um número negativo se s1 é menor que s2, um número positivo se s2 é menor que s1 e 0
se forem iguais. Mas o que é maior, menor e igual? No caso da String, quem
implementou a classe decidiu que o critério de comparação seria a ordem lexicográfica
(alfabética, por assim dizer). Pode ver isso direto na documentação:
https://docs.oracle.com/javase/8/docs/api/java/lang/String.html#compareTo-
java.lang.String-
E como nós devemos fazer na classe Aula? Um método parecido? Mais que isso: um
método com a mesma assinatura! Pois a String implementa uma interface chamada
Comparable, do pacote java.lang, que define exatamente esse método! Você pode ver
também que o método Collections.sort recebe uma List de qualquer tipo de objeto
que implementa Comparable.
https://www.alura.com.br/conteudo/java-collections 11/26
08/06/2020 Java: Dominando as Collections | Alura Cursos Online
@Override
public int compareTo(Aula outraAula) {
// o que colocar aqui?
}
}
É aí que devemos decidir o nosso critério de comparação de duas aulas. Quando uma aula
virá antes da outra? Bem, eu vou optar por ordenar na ordem alfabética. Para isso, vou
aproveitar do próprio método compareTo da String, delegando:
@Override
public String toString() {
return "[Aula: " + this.titulo + ", " + this.tempo + " minutos]";
}
@Override
public int compareTo(Aula outraAula) {
return this.titulo.compareTo(outraAula.titulo);
}
}
https://www.alura.com.br/conteudo/java-collections 12/26
08/06/2020 Java: Dominando as Collections | Alura Cursos Online
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
// antes de ordenar:
System.out.println(aulas);
Collections.sort(aulas);
// depois de ordenar:
System.out.println(aulas);
}
}
@Override
public String toString() {
return "[Aula: " + this.titulo + ", " + this.tempo + " minutos]";
}
@Override
public int compareTo(Aula outraAula) {
return this.titulo.compareTo(outraAula.titulo);
}
}
E se quisermos ordenar essa lista de acordo com o tempo de uma aula? Poderíamos
alterar o método compareTo, mas assim todas as ordenações de aulas seriam afetadas.
Parece complicado? Há uma forma mais enxuta de se fazer isso, utilizando os recursos do
Java 8. Não é o nosso foco aqui. Existe um curso exclusivo desse assunto na Alura, mas é
sempre bom ir se acostumando. Veja como ficaria:
Collections.sort(aulas, Comparator.comparing(Aula::getTempo));
A frase aqui é semelhante a "ordene estas aulas utilizando como comparação o retorno do
método getTempo de cada Aula".
https://www.alura.com.br/conteudo/java-collections 14/26
08/06/2020 Java: Dominando as Collections | Alura Cursos Online
Podemos deixá-la mais bonita. Toda lista, a partir do Java 8, possui um método sort que
recebe Comparator. Poderíamos então fazer:
aulas.sort(Comparator.comparing(Aula::getTempo));
0:00 / 23:35
Vamos aprimorar nosso modelo de classes para torná-lo mais real. O objetivo é ter uma
riqueza de classes e você poder enxergar o dia a dia do uso das coleções.
Para isso, vamos criar uma classe que representa um Curso. Esse Curso vai ter um
punhado de Aulas, que representaremos através de uma lista de Aula. Todo curso
possuirá também um nome, um instrutor, o construtor que acharmos necessário e
também os getters:
https://www.alura.com.br/conteudo/java-collections 15/26
08/06/2020 Java: Dominando as Collections | Alura Cursos Online
Opa! Uma LinkedList? Qual é a diferença dela para uma ArrayList? Você vai ver que
vamos utilizá-la da mesma forma que uma ArrayList e mais para a frente saberemos as
vantagens e desvantagens de cada uma.
Vamos testar essa nossa classe Curso, adicionando uma aula e mostrando o resultado:
https://www.alura.com.br/conteudo/java-collections 16/26
08/06/2020 Java: Dominando as Collections | Alura Cursos Online
O que vai sair aqui? O resultado é [], representando uma coleção vazia. Faz sentido, pois
inicializamos nossa lista de aulas com um new LinkedList que estará vazio.
Vamos fazer uma brincadeira com as variáveis para ver se você já está acostumado com a
forma que o Java trabalha. E se eu adicionar uma aula no javaColecoes e imprimir
novamente o resultado? Será que a variável aulas continuará vazia, já que adicionamos a
nova Aula dentro da lista do curso?
https://www.alura.com.br/conteudo/java-collections 17/26
08/06/2020 Java: Dominando as Collections | Alura Cursos Online
[]
[Aula: Trabalhando com ArrayList, 21 minutos]
Isso é apenas para reforçar que trabalhamos aqui com referências. A variável aulas se
referencia para uma lista de objetos, que é a mesma que nosso atributo interno do curso
em questão se referencia. Isto é, tanto javaColecoes.getAulas() quanto a nossa variável
temporária aulas levam ao mesmo local, à mesma coleção.
Tem gente que vai falar que "se mexeu numa variável, mexeu na outra". Não é bem isso.
Na verdade, são duas variáveis distintas mas que se referenciam ao mesmo objeto.
Mas acabamos violando alguns princípios bons de orientação a objetos. Nesse caso, seria
interessante que fosse necessário pedir a classe Curso para que fosse adicionada uma
Aula, possibilitando fazer algo como javaColecoes.adiciona(...). E isso é fácil: basta
adicionarmos esse método em Curso:
https://www.alura.com.br/conteudo/java-collections 18/26
08/06/2020 Java: Dominando as Collections | Alura Cursos Online
System.out.println(javaColecoes.getAulas());
}
}
Mas quando alguém for usar a classe Curso, ela vai acabar fazendo
javaColecoes.adiciona(...) ou javaColecoes.getAulas().add(...)? Se deixarmos
assim, ele poderá fazer de ambas as formas.
Queremos que ele só faça da primeira forma, usando nosso novo método adiciona. Como
forçar isso? Não há como forçar, mas há como programar defensivamente, fazendo com
que o método getAulas devolva uma cópia da coleção de aulas. Melhor ainda: podemos
devolver essa cópia de tal forma que ela não possa ser alterada, ou seja, que ela seja não
modificável, usando o método Collections.unmodifiableList:
https://www.alura.com.br/conteudo/java-collections 19/26
08/06/2020 Java: Dominando as Collections | Alura Cursos Online
import java.util.LinkedList;
import java.util.List;
import java.util.Collections;
System.out.println(javaColecoes.getAulas());
}
}
https://www.alura.com.br/conteudo/java-collections 20/26
08/06/2020 Java: Dominando as Collections | Alura Cursos Online
@Override
public String toString() {
return "[Aula: " + this.titulo + ", " + this.tempo + " minutos]";
https://www.alura.com.br/conteudo/java-collections 21/26
08/06/2020 Java: Dominando as Collections | Alura Cursos Online
@Override
public int compareTo(Aula outraAula) {
return this.titulo.compareTo(outraAula.getTitulo());
}
}
LinkedList ou ArrayList?
E o mistério da LinkedList? E se tivéssemos usado ArrayList na declaração do atributo
aulas da classe Curso? O resultado seria exatamente o mesmo!
Já o LinkedList possui uma grande vantagem aqui. Ele utiliza a estrutura de dados
chamada lista ligada, e é bastante rápido para adicionar e remover elementos na cabeça
da lista, isto é, na primeira posição. Mas é lento se você precisar acessar um determinado
elemento, pois a implementação precisará percorrer todos os elementos até chegar ao
décimo quinto, por exemplo.
Confuso? Não tem problema. Sabe o que é interessante? Você não precisa tomar essa
decisão desde já e oficializar para sempre. Como utilizamos a referência a List,
comprometendo-nos pouco, podemos sempre mudar a implementação, isso é, em quem
damos new, caso percebamos que é melhor uma ou outra lista nesse caso em particular.
https://www.alura.com.br/conteudo/java-collections 22/26
08/06/2020 Java: Dominando as Collections | Alura Cursos Online
A implementação LinkedList.
Programação defensiva.
Matricule-se e comece a estudar com a gente hoje! Conheça outros tópicos abordados
durante o curso:
Equals e HashCode
Mapas
PREMIUM
PREMIUM MAX
PLUS
1128 cursos
PLANOS
TODOS OS CURSOS
GUIAS DE EMPRESAS
INSTRUTORES
ARTIGOS
https://www.alura.com.br/conteudo/java-collections 24/26
08/06/2020 Java: Dominando as Collections | Alura Cursos Online
PARA ESCOLAS
POLÍTICA DE PRIVACIDADE
TERMOS DE USO
SOBRE NÓS
PERGUNTAS FREQUENTES
FALE CONOSCO
Dúvida, crítica, sugestão ou elogio?
Entre em contato!
EMPRESA? GOVERNO?
Planos corporativos para o seu time.
Saiba mais
POWERED BY
CURSOS
Cursos de Mobile
Flutter, React Native iOS e Swift Android e Kotlin Jogos
Cursos de Programação
Lógica Python PHP Java .NET Node JS Ruby & Rails C Computação Jogos
Cursos de Front-end
HTML, CSS React Angular JavaScript jQuery
Cursos de Infraestrutura
DevOps e Git Cloud Linux IoT Redes
Cursos de Design & UX
Photoshop e Illustrator Usabilidade e UX Vídeo e Motion 3D
Cursos de Marketing Digital
https://www.alura.com.br/conteudo/java-collections 25/26
08/06/2020 Java: Dominando as Collections | Alura Cursos Online
https://www.alura.com.br/conteudo/java-collections 26/26