Guia para o Java ArrayList
1. Visão geral
Neste artigo, vamos dar uma olhada na classeArrayList do Java Collections Framework. Discutiremos suas propriedades, casos de uso comuns, bem como suas vantagens e desvantagens.
ArrayList reside nas Bibliotecas Java Core, então você não precisa de nenhuma biblioteca adicional. Para usá-lo, basta adicionar a seguinte declaração de importação:
import java.util.ArrayList;
List representa uma sequência ordenada de valores onde algum valor pode ocorrer mais de uma vez.
ArrayList é uma das implementações deList construídas sobre uma matriz, que é capaz de aumentar e diminuir dinamicamente conforme você adiciona / remove elementos. Os elementos podem ser facilmente acessados por seus índices a partir do zero. Esta implementação possui as seguintes propriedades:
-
O acesso aleatório levaO(1) tempo
-
Adicionar elemento leva tempo constante amortizadoO(1)
-
Inserting/Deleting takes O(n) time
-
A pesquisa levaO(n) tempo para uma matriz não classificada eO(log n) para uma classificada
2. Crie umArrayList
ArrayList tem vários construtores e apresentaremos todos eles nesta seção.
Primeiro, observe queArrayList é uma classe genérica, então você pode parametrizá-la com qualquer tipo que você quiser e o compilador irá garantir que, por exemplo, você não será capaz de colocar valoresInteger dentro de uma coleção deStrings. Além disso, você não precisa lançar elementos ao recuperá-los de uma coleção.
Em segundo lugar, é uma boa prática usar a interface genéricaList como um tipo de variável, porque ela a separa de uma implementação particular.
2.1. Construtor Sem Arg padrão
List list = new ArrayList<>();
assertTrue(list.isEmpty());
Estamos simplesmente criando uma instância vazia deArrayList.
2.2. Construtor que aceita capacidade inicial
List list = new ArrayList<>(20);
Aqui você especifica o comprimento inicial de uma matriz subjacente. Isso pode ajudar a evitar o redimensionamento desnecessário ao adicionar novos itens.
2.3. Construtor aceitandoCollection
Collection number
= IntStream.range(0, 10).boxed().collect(toSet());
List list = new ArrayList<>(numbers);
assertEquals(10, list.size());
assertTrue(numbers.containsAll(list));
Observe que esse elemento da instânciaCollection é usado para preencher a matriz subjacente.
3. Adicione elementos aoArrayList
Você pode inserir um elemento no final ou na posição específica:
List list = new ArrayList<>();
list.add(1L);
list.add(2L);
list.add(1, 3L);
assertThat(Arrays.asList(1L, 3L, 2L), equalTo(list));
Você também pode inserir uma coleção ou vários elementos de uma vez:
List list = new ArrayList<>(Arrays.asList(1L, 2L, 3L));
LongStream.range(4, 10).boxed()
.collect(collectingAndThen(toCollection(ArrayList::new), ys -> list.addAll(0, ys)));
assertThat(Arrays.asList(4L, 5L, 6L, 7L, 8L, 9L, 1L, 2L, 3L), equalTo(list));
4. Iterar sobreArrayList
Existem dois tipos de iteradores disponíveis:IteratoreListIterator.
Enquanto o primeiro oferece a oportunidade de percorrer a lista em uma direção, o último permite percorrê-la nas duas direções.
Aqui, mostraremos apenas oListIterator:
List list = new ArrayList<>(
IntStream.range(0, 10).boxed().collect(toCollection(ArrayList::new))
);
ListIterator it = list.listIterator(list.size());
List result = new ArrayList<>(list.size());
while (it.hasPrevious()) {
result.add(it.previous());
}
Collections.reverse(list);
assertThat(result, equalTo(list));
Você também pode pesquisar, adicionar ou remover elementos usando iteradores.
5. Pesquise oArrayList
Demonstraremos como a pesquisa funciona usando uma coleção:
List list = LongStream.range(0, 16)
.boxed()
.map(Long::toHexString)
.collect(toCollection(ArrayList::new));
List stringsToSearch = new ArrayList<>(list);
stringsToSearch.addAll(list);
5.1. Pesquisando uma lista não classificada
Para encontrar um elemento, você pode usar os métodosindexOf() oulastIndexOf(). Ambos aceitam um objeto e retornam o valorint:
assertEquals(10, stringsToSearch.indexOf("a"));
assertEquals(26, stringsToSearch.lastIndexOf("a"));
Se quiser encontrar todos os elementos que satisfaçam um predicado, você pode filtrar a coleção usando Java 8Stream API (leia mais sobre issohere) usandoPredicate assim:
Set matchingStrings = new HashSet<>(Arrays.asList("a", "c", "9"));
List result = stringsToSearch
.stream()
.filter(matchingStrings::contains)
.collect(toCollection(ArrayList::new));
assertEquals(6, result.size());
Também é possível usar um loopfor ou um iterador:
Iterator it = stringsToSearch.iterator();
Set matchingStrings = new HashSet<>(Arrays.asList("a", "c", "9"));
List result = new ArrayList<>();
while (it.hasNext()) {
String s = it.next();
if (matchingStrings.contains(s)) {
result.add(s);
}
}
5.2. Pesquisando uma lista classificada
Se você tiver uma matriz classificada, poderá usar um algoritmo de pesquisa binária que funciona mais rápido que a pesquisa linear:
List copy = new ArrayList<>(stringsToSearch);
Collections.sort(copy);
int index = Collections.binarySearch(copy, "f");
assertThat(index, not(equalTo(-1)));
Observe que se um elemento não for encontrado, -1 será retornado.
6. Remova os elementos deArrayList
Para remover um elemento, você deve encontrar seu índice e só então realizar a remoção através do métodoremove(). Uma versão sobrecarregada desse método, que aceita um objeto, procura e executa a remoção da primeira ocorrência de um elemento igual:
List list = new ArrayList<>(
IntStream.range(0, 10).boxed().collect(toCollection(ArrayList::new))
);
Collections.reverse(list);
list.remove(0);
assertThat(list.get(0), equalTo(8));
list.remove(Integer.valueOf(0));
assertFalse(list.contains(0));
Mas tome cuidado ao trabalhar com tipos em caixas, comoInteger. Para remover um elemento em particular, você deve primeiro marcar o valorint ou, caso contrário, um elemento será removido por seu índice.
Você também pode usar oStream API mencionado acima para remover vários itens, mas não o mostraremos aqui. Para esse fim, usaremos um iterador:
Set matchingStrings
= HashSet<>(Arrays.asList("a", "b", "c", "d", "e", "f"));
Iterator it = stringsToSearch.iterator();
while (it.hasNext()) {
if (matchingStrings.contains(it.next())) {
it.remove();
}
}
7. Sumário
Neste artigo rápido, vimos o ArrayList em Java.
Mostramos como criar uma instânciaArrayList, como adicionar, encontrar ou remover elementos usando diferentes abordagens.
Como de costume, você pode encontrar todas as amostras de códigoover on GitHub.