Guide de la liste de tableaux Java

Guide de la liste de tableaux Java

1. Vue d'ensemble

Dans cet article, nous allons examiner la classeArrayList 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;

List représente une séquence ordonnée de valeurs où une valeur peut se produire plus d'une fois.

ArrayList est l'une des implémentations deList 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 peuvent être facilement accessibles par leurs index à partir de zéro. Cette implémentation a les propriétés suivantes:

  • L'accès aléatoire prendO(1) temps

  • L'ajout d'un élément prend un temps constant amortiO(1)

  • Inserting/Deleting takes O(n) time

  • La recherche prendO(n) de temps pour un tableau non trié etO(log n) pour un tableau trié

2. Créer unArrayList

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

Tout d'abord, notez queArrayList 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 les valeurs deInteger dans une collection deStrings. De plus, vous n'avez pas besoin de caster des éléments lors de leur récupération à partir d'une collection.

Deuxièmement, il est recommandé d'utiliser l'interface génériqueList 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 instanceArrayList 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. Constructeur acceptantCollection

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'instanceCollection est utilisé pour remplir le tableau sous-jacent.

3. Ajouter des éléments auxArrayList

Vous pouvez insérer un élément à la fin ou à 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 lesArrayList

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

Alors que le premier vous donne la possibilité de parcourir la liste dans un sens, le dernier vous permet de le parcourir dans les deux sens.

Ici, nous ne vous montrerons que lesListIterator:

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 lesArrayList

Nous allons démontrer comment la recherche fonctionne avec 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

Afin de trouver un élément, vous pouvez utiliser les méthodesindexOf() oulastIndexOf(). Ils acceptent tous les deux un objet et renvoient la valeurint:

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 en utilisant Java 8Stream API (en savoir plushere) en utilisantPredicate 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 bouclefor 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é, alors -1 sera renvoyé.

6. Supprimer des éléments desArrayList

Afin de supprimer un élément, vous devez trouver son index et seulement ensuite effectuer la suppression via la méthoderemove(). Une version surchargée de cette méthode, qui accepte un objet, le recherche et supprime la première occurrence d'un élément égal:

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

Mais soyez prudent lorsque vous travaillez avec des types encadrés tels queInteger. Afin de supprimer un élément particulier, vous devez d'abord encadrer la valeurint ou sinon, un élément sera supprimé par son index.

Vous pouvez également utiliser lesStream APIusmentionnés pour supprimer plusieurs éléments, mais nous ne les afficherons pas ici. Pour cela, nous utiliserons un itérateur:

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

Dans cet article rapide, nous avons examiné la liste ArrayList en Java.

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

Comme d'habitude, vous pouvez trouver tous les échantillons de codeover on GitHub.