devstory

Le Tutoriel de Java ArrayList

  1. ArrayList
  2. Comment ArrayList stocke-t-il les éléments?
  3. Examples

1. ArrayList

ArrayList est une classe qui implémente l'interface List et prend en charge toutes les fonctionnalités de List, y compris les fonctionnalités facultatives. En règle générale, un ArrayList gère un tableau pour stocker ses éléments, qui peuvent être remplacés par un autre tableau de plus grande longueur si le nombre d'éléments d'ArrayList augmente.
public class ArrayList<E> extends AbstractList<E>
        implements List<E>, RandomAccess, Cloneable, java.io.Serializable
Voici les caractéristiques d'ArrayList:
  • ArrayList permet de contenir les éléments dupliqués et null.
  • ArrayList maintient l'ordre d'insertion des éléments.
  • ArrayList n'est pas synchrone (non synchronized), par conséquent, il est nécessaire de le synchroniser pour être utilisé dans l'environnement Multithreading.
  • ArrayList autorise un accès aléatoire aux éléments en fonction de l'indice.
  • L'opération dans ArrayList est un peu plus lente par rapport à LinkedList (Voir plus d'explication dans le principe d'opération d'ArrayList).
ArrayList est pratiquement similaire à Vector, sauf s'il n'est pas synchrone. Dans l'environnement Multithreading, il doit être enveloppé (wrapped) en utilisant la méthode Collections.synchronizedList.
ArrayList<String> arrayList = new ArrayList<String>();
        
List<String> syncList = Collections.synchronizedList(arrayList);
CopyOnWriteArrayList est une variante sécurisée (thread-safe) d'ArrayList que vous pouvez utiliser.
ArrayList constructors:
ArrayList()
Créer un objet ArrayList vide dont la capacité du tableau interne initial est de 10 éléments.
ArrayList(Collection<? extends E> c)
Créer un objet ArrayList contenant tous les éléments de la Collection spécifiée, l'ordre des éléments est déterminé par Iterator de Collection.
ArrayList(int initialCapacity)
Créer un objet ArrayList vide dont la capacité initiale du tableau interne est spécifiée.

2. Comment ArrayList stocke-t-il les éléments?

ArrayList gère un tableau d'objets. Toutes les actions d'ajout, d'insertion ou de suppression d'un élément d'ArrayList produiront une action d'affectation (ou de mise à jour) de valeur aux autres éléments du tableau, ce qui peut affecter de nombreux éléments du tableau.
arrayList.add(X)
Lorsque vous ajoutez un élément dans ArrayList, il sera assigné à un élément du tableau à l'indice arrayList.size().
arrayList.add(idx,X)
Lorsque vous insérez un élément dans ArrayList, de nombreux éléments du tableau devront mettre à jour leurs valeurs.
arrayList.remove(idx)
La suppression d'un élément à l'index idx d'ArrayList entraîne également la mise à jour de nombreux éléments du tableau avec de nouvelles valeurs.
ArrayList remplace le tableau qu'il gère par un nouveau tableau d'une longueur supérieure si le nombre d'éléments ajoutés est supérieur à la longueur du tableau actuel.

3. Examples

Par exemple: utiliser ArrayList dans l'environnement Multithreading:
ArrayList_sync.java
package org.o7planning.arraylist.ex;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class ArrayList_sync {

    public static void main(String[] args) throws InterruptedException {
        new ArrayList_sync();
    }
    
    public ArrayList_sync() throws InterruptedException {
         ArrayList<String> arrayList = new ArrayList<String>();
         
         List<String> syncList = Collections.synchronizedList(arrayList);
          
         ThreadA threadA = new ThreadA(syncList);
         ThreadB threadB = new ThreadB(syncList);
         
         threadA.start();
         threadB.start();
         
         threadA.join();
         threadB.join();
         
         for(String s: syncList)  {
             System.out.println(s);
         }
    }
    
   class ThreadA extends Thread {
        private List<String> list;
        public ThreadA(List<String> list) {
            this.list = list;
        }
        @Override
        public void run() {
            for(int i= 0; i< 1000; i++) {
                this.list.add("A "+ i);
            }
        }
    }
    
    class ThreadB extends Thread {
        private List<String> list;
        public ThreadB(List<String> list) {
            this.list = list;
        }
        @Override
        public void run() {
            for(int i= 0; i< 1000; i++) {
                this.list.add("B "+ i);
            }
        }
    }
}
Output:
...
A 938
B 898
A 939
B 899
A 940
B 900
A 941
B 901
A 942
...
ArrayList prend en charge toutes les fonctionnalités spécifiées dans l'interface List incluant celles facultatives. Vous pouvez trouver de meilleurs exemples sur ArrayList dans l'article ci-dessous: