« Me voilà. »

« Bonjour Ellie ! »

« Aujourd'hui, nous allons discuter d'un sujet intéressant. Je vais te parler de la classe ArrayList. »

« Une nouvelle classe ? Cool ! Qu'est-ce qu'elle peut faire ? »

« Laisse-moi commencer par une petite histoire. La seule chose que les programmeurs n'aiment pas au sujet des tableaux est que tu ne peux pas changer leur taille. Que faire si tu as besoin d'ajouter trois autres éléments à un tableau qui n'a qu'un seul emplacement libre ? »

« La seule solution à ce problème est de créer des tableaux très grands, afin de garantir d'avoir assez de place pour tous les éléments. Cependant, cela signifie souvent du gaspillage de mémoire. Si un tableau contient habituellement trois éléments, mais qu'il y a une chance, même infime, qu'il puisse être nécessaire d'en stocker 100, tu dois créer un tableau de 100 éléments. »

« Alors, qu'est-ce que les programmeurs ont inventé ? »

« Ils ont écrit la classe ArrayList, qui fait la même chose qu'un tableau, mais qui peut en plus changer sa taille. »

« Bien vu. Comment ils ont réussi leur coup ? »

« Chaque objet ArrayList stocke simplement un tableau ordinaire d'éléments. Lorsque tu lis des éléments dans un ArrayList, il les lit depuis son tableau interne. Lorsque tu les écris dans un ArrayList, il les écrit dans son tableau intérieur. Ici, comparons ces colonnes : »

Array ArrayList
Crée un conteneur d'éléments
String[] list = new String[10];
ArrayList<String> list = new ArrayList<String>();
Obtention du nombre d'éléments
int n = list.length;
int n = list.size();
Obtention d'un élément d'un tableau/d'une collection
String s = list[3];
String s = list.get(3);
Écriture d'un élément dans un tableau
list[3] = s;
list.set(3, s);

« Alors pourquoi ArrayList est mieux ? Tout ce que je vois, c'est que le code est plus long, maintenant. »

« Premièrement, ArrayList prend en charge plusieurs opérations supplémentaires que les programmeurs doivent effectuer tout le temps. Un tableau ordinaire ne propose pas ces opérations. Par exemple, l'insertion ou la suppression d'éléments au milieu d'un tableau sans laisser de trous. »

« Deuxièmement, la possibilité de changer la taille du tableau. Lorsque tu as besoin d'ajouter un élément, mais que le tableau interne n'a pas d'emplacements libres, voici ce qui se passe à l'intérieur d'ArrayList :

a) Un autre tableau est créé, 50 % plus grand que le tableau interne actuel, plus un élément.

b) Tous les éléments de l'ancien tableau sont copiés dans le nouveau.

c) Le nouveau tableau est enregistré comme tableau interne de l'objet ArrayList. L'ancien tableau est déclaré inutile (nous arrêtons simplement de stocker sa référence). »

Array ArrayList
Ajouter un élément à la fin du tableau
Cette action n'est pas prise en charge
list.add(s);
Ajouter un élément au milieu du tableau
Cette action n'est pas prise en charge
list.add(15, s);
Ajouter un élément au début du tableau
Cette action n'est pas prise en charge
list.add(0, s);
Supprimer un élément du tableau
Nous pourrions supprimer un élément avec list[3] = null. Mais cela laisserait un « trou » dans le tableau.
list.remove(3);

« Comment peut-on travailler avec cette ArrayList ? »

« Comme nous le ferions avec un tableau ordinaire, en fait. Regarde. Comparons le travail avec une ArrayList et celui avec un tableau. Supposons que nous devons 'lire 10 chaînes puis les afficher à l'écran dans l'ordre inverse'. »

« Regarde :

Avec un tableau
public static void main(String[] args)
{
Reader r = new InputStreamReader(System.in);
BufferedReader reader = new BufferedReader(r);

// Read strings from the keyboard
String[] list = new String[10];
for (int i = 0; i < list.length; i++)
{
  String s = reader.readLine();
  list[i] = s;
}

// Display the contents of the array
for (int i = 0; i < list.length; i++)
{
  int j = list.length - i - 1;
  System.out.println( list[j] );
}
}
Avec une ArrayList
public static void main(String[] args)
{
Reader r = new InputStreamReader(System.in);
BufferedReader reader = new BufferedReader(r);

// Read strings from the keyboard
ArrayList&ltString> list = new ArrayList&ltString>();
for (int i = 0; i < 10; i++)
{
  String s = reader.readLine();
  list.add(s);
}

// Display the contents of the collection
for (int i = 0; i < list.size(); i++)
{
  int j = list.size() - i - 1;
  System.out.println( list.get(j) );
}
}

J'ai utilisé la même couleur pour mettre en évidence les actions similaires dans chaque colonne. »

« D'une part, tout est différent. De l'autre, c'est toujours la même chose. »

« Exact. Sauf que nous n'utilisons pas de crochets lorsque nous travaillons avec une ArrayList. À la place, nous utilisons les méthodes get, set et add. »

« Oui, j'avais noté. Mais ça ressemble quand même beaucoup. »