Anleitung zur Java ArrayList

1. Übersicht

In diesem Artikel werfen wir einen Blick auf die ArrayList- Klasse aus dem Java Collections Framework. Wir werden seine Eigenschaften, häufige Anwendungsfälle sowie seine Vor- und Nachteile diskutieren.

ArrayList befindet sich in Java Core Libraries, sodass Sie keine zusätzlichen Bibliotheken benötigen. Um es zu verwenden, fügen Sie einfach die folgende Importanweisung hinzu:

import java.util.ArrayList;

Die Liste stellt eine geordnete Folge von Werten dar, bei denen ein Wert mehr als einmal auftreten kann.

ArrayList ist eine der List- Implementierungen, die auf einem Array erstellt wurden und beim Hinzufügen / Entfernen von Elementen dynamisch wachsen und verkleinern können. Auf Elemente kann leicht über ihre Indizes ab Null zugegriffen werden. Diese Implementierung hat die folgenden Eigenschaften:

  • Der wahlfreie Zugriff benötigt O (1) Zeit
  • Das Hinzufügen eines Elements dauert die amortisierte konstante Zeit O (1)
  • Einfügen / Löschen dauert O (n) Zeit
  • Die Suche benötigt O (n) Zeit für ein unsortiertes Array und O (log n) für ein sortiertes Array

2. Erstellen Sie eine ArrayList

ArrayList hat mehrere Konstruktoren und wir werden sie alle in diesem Abschnitt vorstellen.

Beachten Sie zunächst, dass ArrayList eine generische Klasse ist, sodass Sie sie mit einem beliebigen Typ parametrisieren können und der Compiler sicherstellt, dass Sie beispielsweise keine Integer- Werte in eine Sammlung von Strings einfügen können . Außerdem müssen Sie keine Elemente umwandeln, wenn Sie sie aus einer Sammlung abrufen.

Zweitens ist es gute Praxis , generische Schnittstelle zu verwenden Liste als Variablentyp, weil es von einer bestimmten Implementierung abkoppelt.

2.1. Standard-No-Arg-Konstruktor

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

Wir erstellen einfach eine leere ArrayList- Instanz.

2.2. Konstruktor, der die Anfangskapazität akzeptiert

List list = new ArrayList(20);

Hier geben Sie die Anfangslänge eines zugrunde liegenden Arrays an. Dies kann Ihnen helfen, unnötige Größenänderungen beim Hinzufügen neuer Elemente zu vermeiden.

2.3. Konstruktor, der Sammlung annimmt

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

Beachten Sie, dass dieses Element der Collection- Instanz zum Auffüllen des zugrunde liegenden Arrays verwendet wird.

3. Fügen Sie der ArrayList Elemente hinzu

Sie können ein Element entweder am Ende oder an der bestimmten Position einfügen:

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

Sie können auch eine Sammlung oder mehrere Elemente gleichzeitig einfügen:

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. Durchlaufen Sie die ArrayList

Es gibt zwei Arten von Iteratoren: Iterator und ListIterator .

Während Ersteres Ihnen die Möglichkeit gibt, die Liste in eine Richtung zu durchlaufen, können Sie sie mit Letzterem in beide Richtungen durchlaufen.

Hier zeigen wir Ihnen nur den 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));

Sie können Elemente auch mithilfe von Iteratoren suchen, hinzufügen oder entfernen.

5. Durchsuchen Sie die ArrayList

Wir werden anhand einer Sammlung zeigen, wie die Suche funktioniert:

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

5.1. Durchsuchen einer unsortierten Liste

Um ein Element zu finden, können Sie die Methoden indexOf () oder lastIndexOf () verwenden. Beide akzeptieren ein Objekt und geben den int- Wert zurück:

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

Wenn Sie alle Elemente finden möchten, die ein Prädikat erfüllen, können Sie die Sammlung mithilfe der Java 8 Stream-API (lesen Sie hier mehr dazu) mithilfe von Prädikat wie folgt filtern :

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

Es ist auch möglich, eine for- Schleife oder einen Iterator zu verwenden:

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. Durchsuchen einer sortierten Liste

Wenn Sie ein sortiertes Array haben, können Sie einen binären Suchalgorithmus verwenden, der schneller als die lineare Suche funktioniert:

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

Beachten Sie, dass -1 zurückgegeben wird, wenn ein Element nicht gefunden wird.

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.

Wir haben gezeigt, wie man eine ArrayList- Instanz erstellt, wie man Elemente mit verschiedenen Ansätzen hinzufügt, findet oder entfernt.

Wie üblich finden Sie alle Codebeispiele auf GitHub.