Guide de Java ArrayList

1. Vue d'ensemble

Dans cet article, nous allons examiner la classe ArrayList de Java Collections Framework. Nous discuterons de ses propriétés, des cas d'utilisation courants, ainsi que de ses avantages et inconvénients.

ArrayList réside dans les bibliothèques Java Core, vous n'avez donc pas besoin de bibliothèques supplémentaires. Pour l'utiliser, ajoutez simplement la déclaration d'importation suivante:

import java.util.ArrayList;

La liste représente une séquence ordonnée de valeurs où une valeur peut apparaître plusieurs fois.

ArrayList est l'une des implémentations de List construites au sommet d'un tableau, qui est capable de croître et de réduire dynamiquement lorsque vous ajoutez / supprimez des éléments. Les éléments étaient facilement accessibles par leurs index à partir de zéro. Cette implémentation a les propriétés suivantes:

  • L'accès aléatoire prend O (1) temps
  • L'ajout d'un élément prend un temps constant amorti O (1)
  • L'insertion / la suppression prend O (n) temps
  • La recherche prend O (n) temps pour un tableau non trié et O (log n) pour un tableau trié

2. Créez une ArrayList

ArrayList a plusieurs constructeurs et nous les présenterons tous dans cette section.

Tout d'abord, notez qu'ArrayList est une classe générique, vous pouvez donc la paramétrer avec le type de votre choix et le compilateur s'assurera que, par exemple, vous ne pourrez pas mettre de valeurs Integer dans une collection de Strings . De plus, vous n'avez pas besoin de convertir des éléments lors de leur récupération à partir d'une collection.

Deuxièmement, il est recommandé d'utiliser l'interface générique List comme type de variable, car elle la dissocie d'une implémentation particulière.

2.1. Constructeur No-Arg par défaut

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

Nous créons simplement une instance ArrayList vide .

2.2. Constructeur acceptant la capacité initiale

List list = new ArrayList(20);

Ici, vous spécifiez la longueur initiale d'un tableau sous-jacent. Cela peut vous aider à éviter un redimensionnement inutile lors de l'ajout de nouveaux éléments.

2.3. Collection acceptant le constructeur

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

Notez que cet élément de l' instance Collection est utilisé pour remplir le tableau sous-jacent.

3. Ajouter des éléments à la ArrayList

Vous pouvez insérer un élément soit à la fin, soit à la position spécifique:

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

Vous pouvez également insérer une collection ou plusieurs éléments à la fois:

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. Itérer sur la ArrayList

Il existe deux types d'itérateurs disponibles: Iterator et ListIterator .

Alors que le premier vous donne la possibilité de parcourir la liste dans une direction, le second vous permet de la parcourir dans les deux sens.

Ici, nous ne vous montrerons que le 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));

Vous pouvez également rechercher, ajouter ou supprimer des éléments à l'aide d'itérateurs.

5. Rechercher dans ArrayList

Nous montrerons comment fonctionne la recherche à l'aide d'une collection:

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

5.1. Recherche dans une liste non triée

Pour trouver un élément, vous pouvez utiliser les méthodes indexOf () ou lastIndexOf () . Ils acceptent tous les deux un objet et renvoient une valeur int :

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

Si vous voulez trouver tous les éléments satisfaisant un prédicat, vous pouvez filtrer la collection à l'aide de l' API Java 8 Stream (en savoir plus ici) en utilisant Predicate comme ceci:

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

Il est également possible d'utiliser une boucle for ou un itérateur:

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. Recherche dans une liste triée

Si vous avez un tableau trié, vous pouvez utiliser un algorithme de recherche binaire qui fonctionne plus rapidement que la recherche linéaire:

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

Notez que si un élément n'est pas trouvé, -1 sera renvoyé.

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.

Nous avons montré comment créer une instance ArrayList , comment ajouter, rechercher ou supprimer des éléments en utilisant différentes approches.

Comme d'habitude, vous pouvez trouver tous les exemples de code sur GitHub.