A Classe ArrayList em Java
As Collections são estruturas de dados pré-definidas, fornecidas pela API do Java, que são empregadas para armazenar grupos de objetos relacionados na memória durante a execução do programa. Com estas classes é possível organizar, armazenar e ler dados sem a necessidade de saber exatamente como os dados são armazenados (encapsulamento).
Um array convencional não tem seu tamanho modificado automaticamente durante a execução do programa, por exemplo para armazenar novos elementos, o que pode ser um problema, principalmente se surge a necessidade de armazenar mais elementos após um array estar completo.
O framework Collections em Java fornece diversas interfaces e classes para manipulação de grupos de objetos, como por exemplo:
- Interfaces
- List
- Set
- Queue
- Deque
- SortedSet
- Classes
- ArrayList
- LinkedList
- Vector
- HashSet
- PriorityQueue
- LinkedHashSet
- TreeSet
Nesta lição vamos iniciar o estudo das Collections com a classe ArrayList.
Classe ArrayList
A classe de coleção (collections class) ArrayList<T>, pertencente ao pacote java.util, e que implementa a interface List, resolve o problema de modificação do tamanho de um array em tempo de execução, pois ela pode mudar seu tamanho de forma dinâmica – ou seja, permite criar um array dinâmico. A letra T indica um placeholder, que é substituído ao declarar um ArrayList pelo tipo de elementos que a estrutura irá armazenar.
Suponha que desejemos criar um ArrayList de strings, de nome produtos. Para tal, executamos a seguinte declaração:
ArrayList<String> produtos;
Note que somente tipos não-primitivos podem ser usados para declarar variáveis e criar objetos em classes genéricas – e o ArrayList é uma classe genérica. Ainda assim, em Java é possível usar tipos primitivos, desde que empacotados como se fossem objetos, em um processo denominado boxing. Desta forma, poderíamos criar um ArrayList de inteiros também, por exemplo:
ArrayList<Integer> numeros;
Ao ler um valor deste ArrayList o elemento (valor inteiro) é desempacotado (processo de unboxing).
Métodos principais de um ArrayList
A seguir listamos os principais métodos fornecidos por uma classe ArrayList:
- Método add – Adiciona um elemento no final do ArrayList.
- Método clear – Remove todos os elementos da estrutura.
- Método contains – Verifica se o ArrayList contém um elemento especificado, e retorna true em caso positivo, ou false caso contrário.
- Método get – Retorna o item em uma posição de índice especificada.
- Método indexOf – Retorna a posição de índice da primeira ocorrência de um elemento especificado.
- Método remove – Remove a primeira ocorrência de um valor especificado ou de um elemento em um índice.
- Método size – Informa o número de elementos que estão armazenados na estrutura.
- Método trimToSize – Ajusta a capacidade do ArrayList de acordo com o número de elementos armazenados no momento.
Exemplo
Vejamos um exemplo de uso de ArrayList.
import java.util.ArrayList; public class ListaArrayList { public static void main(String[] args) { // Criar um novo ArrayList de Strings com capacidade inicial de 10 elementos (padrão) ArrayList<String> frutas = new ArrayList<>(); frutas.add("Maçã"); // Adicionar um item à lista frutas.add(0, "Uva"); // Inserir a fruta Uva na posição de índice 0 System.out.println("Mostrar o conteúdo do ArrayList usando laço for convencional:"); for (int i = 0; i < frutas.size(); i++) System.out.printf(" %s", frutas.get(i)); // Mostrar as frutas com o método mostrar(). Passamos a lista e um frase-cabeçalho mostrar(frutas,"%nMostrando a lista de frutas com o método mostrar:"); frutas.add("Tangerina"); // Adicionar tangerina ao final da lista frutas.add("Morango"); // Idem com Morango mostrar(frutas, "Nova visualização da lista após adicionar frutas:"); frutas.remove("Uva"); // remover a fruta Uva" mostrar(frutas, "Nova visualização da lista após remover frutas:"); frutas.remove(1); // Remover item na posição de índice 1 mostrar(frutas, "Remover o segundo elemento da lista (índice 1):"); // Verificar número de elementos na lista System.out.printf("Tamanho atual do ArrayList: %s itens%n", frutas.size()); // Verificar se um item existe na lista System.out.printf("A fruta \"Tangerina\" %sestá na lista%n", frutas.contains("Tangerina") ? "": "não "); } // criar método para mostrar os elementos do ArrayList frutas public static void mostrar(ArrayList<String> frutas, String cabecalho) { System.out.printf(cabecalho); // mostrar cabeçalho for (String item : frutas) System.out.printf(" %s", item); System.out.println(); } }
Neste exemplo criamos um ArrayList de String chamado de frutas, e adicionamos dois nomes de frutas a ele usando o método add.
Logo após, mostramos o conteúdo do ArrayList iterando pelos seus elementos com um laço for, e lendo cada item com o método get.
Também criamos um método especial para mostrar o conteúdo do ArrayList, de nome mostrar(), que recebe como argumentos o nome do ArrayList e uma mensagem a ser exibida juntamente com os elementos retornados.
Removemos um elemento usando o método remove, e verificamos o seu tamanho com o método size.
Finalmente, verificamos se um item está contido no ArrayList usando o método contains.
Na próxima lição vamos estudar as listas ligadas, implementadas com a classe LinkedList.