Guida a Java ArrayList

1. Panoramica

In questo articolo, daremo un'occhiata alla classe ArrayList da Java Collections Framework. Discuteremo le sue proprietà, i casi d'uso comuni, nonché i suoi vantaggi e svantaggi.

ArrayList risiede all'interno di Java Core Libraries, quindi non hai bisogno di librerie aggiuntive. Per usarlo basta aggiungere la seguente dichiarazione di importazione:

import java.util.ArrayList;

List rappresenta una sequenza ordinata di valori in cui un valore può verificarsi più di una volta.

ArrayList è una delle implementazioni di List costruite su un array, che è in grado di crescere e ridursi dinamicamente quando si aggiungono / rimuovono elementi. Gli elementi potrebbero essere facilmente accessibili tramite i loro indici a partire da zero. Questa implementazione ha le seguenti proprietà:

  • L'accesso casuale richiede O (1) tempo
  • L'aggiunta di un elemento richiede un tempo costante ammortizzato O (1)
  • L'inserimento / eliminazione richiede O (n) tempo
  • La ricerca richiede O (n) tempo per un array non ordinato e O (log n) per uno ordinato

2. Creare un ArrayList

ArrayList ha diversi costruttori e li presenteremo tutti in questa sezione.

Innanzitutto, nota che ArrayList è una classe generica, quindi puoi parametrizzarla con qualsiasi tipo tu voglia e il compilatore farà in modo che, ad esempio, non sarai in grado di inserire valori Integer all'interno di una raccolta di stringhe . Inoltre, non è necessario eseguire il cast di elementi durante il recupero da una raccolta.

In secondo luogo, è buona norma utilizzare List dell'interfaccia generica come tipo di variabile, poiché la disaccoppia da una particolare implementazione.

2.1. Costruttore No-Arg predefinito

List list = new ArrayList(); assertTrue(list.isEmpty());

Stiamo semplicemente creando un'istanza ArrayList vuota .

2.2. Costruttore che accetta capacità iniziale

List list = new ArrayList(20);

Qui si specifica la lunghezza iniziale di un array sottostante. Questo può aiutarti a evitare ridimensionamenti non necessari durante l'aggiunta di nuovi elementi.

2.3. Costruttore che accetta la raccolta

Collection number = IntStream.range(0, 10).boxed().collect(toSet()); List list = new ArrayList(numbers); assertEquals(10, list.size()); assertTrue(numbers.containsAll(list));

Si noti che l'elemento dell'istanza Collection viene utilizzato per popolare l'array sottostante.

3. Aggiungere elementi a ArrayList

Puoi inserire un elemento alla fine o nella posizione specifica:

List list = new ArrayList(); list.add(1L); list.add(2L); list.add(1, 3L); assertThat(Arrays.asList(1L, 3L, 2L), equalTo(list));

Puoi anche inserire una raccolta o più elementi contemporaneamente:

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. Ripetizione su ArrayList

Sono disponibili due tipi di iteratori: Iterator e ListIterator .

Mentre il primo ti dà l'opportunità di attraversare l'elenco in una direzione, il secondo ti consente di attraversarlo in entrambe le direzioni.

Qui ti mostreremo solo ListIterator :

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));

Puoi anche cercare, aggiungere o rimuovere elementi usando gli iteratori.

5. Cerca nell'ArrayList

Dimostreremo come funziona la ricerca utilizzando una raccolta:

List list = LongStream.range(0, 16) .boxed() .map(Long::toHexString) .collect(toCollection(ArrayList::new)); List stringsToSearch = new ArrayList(list); stringsToSearch.addAll(list);

5.1. Ricerca in un elenco non ordinato

Al fine di trovare un elemento è possibile utilizzare indexOf () o lastIndexOf () metodi. Entrambi accettano un oggetto e restituiscono un valore int :

assertEquals(10, stringsToSearch.indexOf("a")); assertEquals(26, stringsToSearch.lastIndexOf("a"));

Se vuoi trovare tutti gli elementi che soddisfano un predicato, puoi filtrare la raccolta utilizzando Java 8 Stream API (leggi di più su di esso qui) utilizzando Predicate in questo modo:

Set matchingStrings = new HashSet(Arrays.asList("a", "c", "9")); List result = stringsToSearch .stream() .filter(matchingStrings::contains) .collect(toCollection(ArrayList::new)); assertEquals(6, result.size());

È anche possibile utilizzare un ciclo for o un iteratore:

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. Ricerca in un elenco ordinato

Se hai un array ordinato, puoi usare un algoritmo di ricerca binaria che funziona più velocemente della ricerca lineare:

List copy = new ArrayList(stringsToSearch); Collections.sort(copy); int index = Collections.binarySearch(copy, "f"); assertThat(index, not(equalTo(-1)));

Si noti che se un elemento non viene trovato, verrà restituito -1.

6. Remove Elements from the ArrayList

In order to remove an element, you should find its index and only then perform the removal via remove() method. An overloaded version of this method, that accepts an object, searches for it and performs removal of the first occurrence of an equal element:

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));

But be careful when working with boxed types such as Integer. In order to remove a particular element, you should first box int value or otherwise, an element will be removed by its index.

You may as well use the aforementioned Stream API for removing several items, but we won't show it here. For this purpose we will use an iterator:

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. Summary

In this quick article, we had a look at the ArrayList in Java.

Abbiamo mostrato come creare un'istanza ArrayList , come aggiungere, trovare o rimuovere elementi utilizzando approcci diversi.

Come al solito, puoi trovare tutti gli esempi di codice su GitHub.