- 1 1. Introduction
- 2 2. Qu’est‑ce que List ?
- 3 3. Utilisation de base de List
- 3.1 Déclaration et initialisation de List
- 3.2 Ajout d’éléments (add)
- 3.3 Récupération d’éléments (get)
- 3.4 Mise à jour d’éléments (set)
- 3.5 Suppression d’éléments (remove)
- 3.6 Obtention de la taille de la List (size)
- 3.7 Vérification de l’existence d’un élément (contains)
- 3.8 Résumé : Liste des opérations de base fréquemment utilisées
- 4 4. Exemples d’opérations sur les Listes
- 5 5. Différences et utilisation d’ArrayList et de LinkedList
- 6 6. Utilisation avancée de List
- 7 7. Erreurs courantes et leurs solutions
- 8 8. Conclusion
- 9 Foire aux questions (FAQ)
- 9.1 Q1. Quelle est la différence entre List et Array en Java ?
- 9.2 Q2. Dois‑je utiliser ArrayList ou LinkedList ?
- 9.3 Q3. Puis‑je stocker des types primitifs (comme int ou double) dans une List ?
- 9.4 Q4. Comment trier les éléments d’une List ?
- 9.5 Q5. Que faire si je veux gérer des éléments sans doublons ?
- 9.6 Q6. Que faire pour vider tous les éléments d’une List ?
- 9.7 Q7. Quelles sont les opérations les plus fréquemment utilisées sur une List ?
1. Introduction
Quelle est l’importance de List en Java ?
En programmation Java, « List » est une structure de données qui apparaît très fréquemment. Surtout dans les situations où l’on veut gérer plusieurs valeurs ensemble, elle est plus souple et plus facile à utiliser que les tableaux, ce qui la rend très prisée dans de nombreux scénarios pratiques.
« List » est une interface centrale du Java Collections Framework et offre un mécanisme pour traiter diverses situations grâce à différentes classes d’implémentation telles que ArrayList et LinkedList. La possibilité d’effectuer des opérations comme l’ajout, la suppression, la recherche et la mise à jour de données de façon intuitive est l’une des raisons pour lesquelles List est favorisée.
Objectif et public cible de cet article
Cet article expliquera de façon systématique « Java List » des bases aux sujets avancés, de manière compréhensible pour les débutants. Le public principal visé est le suivant :
- Ceux qui commencent à apprendre Java et ne savent pas comment utiliser List
- Ceux qui souhaitent comprendre clairement la différence entre un tableau et une List
- Ceux qui hésitent entre ArrayList et LinkedList
- Ceux qui veulent revoir les bases avant d’utiliser List en pratique
À la fin de la lecture, notre objectif est que vous ayez une compréhension solide des concepts fondamentaux, des méthodes d’implémentation et des opérations spécifiques de List en Java, vous permettant de coder en toute confiance.
À partir du prochain chapitre, nous commencerons par expliquer la partie de base, « Qu’est‑ce que List ? », étape par étape.
2. Qu’est‑ce que List ?
Vue d’ensemble et caractéristiques de List
« List » en Java est une interface de collection qui contient les éléments dans un ordre séquentiel. Ses principales caractéristiques sont que l’ordre d’ajout des éléments est conservé et que les éléments individuels peuvent être accédés via un indice (commençant à 0).
List fait partie du Collections Framework et possède les attributs suivants :
- Autorise les éléments dupliqués
- Permet d’obtenir, de mettre à jour et de supprimer des éléments en spécifiant un indice
- Peut augmenter ou diminuer dynamiquement le nombre d’éléments (contrairement aux tableaux, elle n’est pas de taille fixe)
Cela permet une manipulation flexible des données et est très souvent utilisé dans le travail pratique.
Différence avec les tableaux
En Java, les tableaux (comme int[] ou String[]) existent également comme moyen de contenir plusieurs valeurs, mais ils diffèrent de List à plusieurs égards.
| Comparison Item | Array | List |
|---|---|---|
| Changing number of elements | Not possible (fixed-size) | Possible (can increase/decrease dynamically) |
| Provided functionality | Minimal operations (indexed access, length retrieval) | Rich methods (add, remove, contains, etc.) |
| Type | Can handle primitive types | Object types only (wrapper classes required) |
| Type safety | Arrays checked at compile time | Can strictly specify type with Generics |
Ainsi, List est une collection plus souple et riche en fonctionnalités, ce qui la rend plus pratique que les tableaux dans de nombreuses situations.
Interface List et ses classes d’implémentation
Lorsqu’on utilise List en Java, on déclare généralement une variable avec l’interface List et on crée une instance à l’aide d’une classe concrète (classe d’implémentation). Les classes d’implémentation représentatives sont les suivantes :
- ArrayList – Structure similaire à un tableau, permettant un accès rapide. Idéale pour la recherche de données et l’accès aléatoire.
- LinkedList – Implémentée avec une structure de liste doublement chaînée. Rapide pour les insertions et suppressions, adaptée aux listes où ces opérations sont fréquentes.
- Vector – Similaire à ArrayList mais légèrement plus lourd car il est thread‑safe. Peu utilisé de nos jours.
En général, ArrayList est la plus couramment utilisée, sauf raison particulière. Il convient de choisir la classe appropriée en fonction de la comparaison de performances décrite plus loin, selon le cas d’utilisation.
3. Utilisation de base de List
Cette section explique, pas à pas, les opérations de base lorsqu’on utilise List en Java. Nous nous appuierons principalement sur ArrayList comme exemple pour présenter les opérations représentatives de List.
Déclaration et initialisation de List
Tout d’abord, voyons la déclaration et l’initialisation de base d’une List avec ArrayList.
import java.util.ArrayList;
import java.util.List;
public class Main {
public static void main(String[] args) {
List<String> fruits = new ArrayList<>();
}
}
Il est courant de déclarer une variable avec l’interface List et de l’instancier avec ArrayList. Les génériques sont utilisés pour spécifier le type à stocker (ici, String).
Ajout d’éléments (add)
Pour ajouter des éléments à une List, utilisez la méthode add().
fruits.add("apple");
fruits.add("banana");
fruits.add("orange");
Cela ajoute trois éléments à la List en séquence. La List préserve l’ordre d’ajout.
Récupération d’éléments (get)
Pour obtenir un élément à un indice spécifié, utilisez get(int index).
System.out.println(fruits.get(0)); // "apple" will be displayed
Notez que les indices commencent à 0.
Mise à jour d’éléments (set)
Pour mettre à jour un élément à une certaine position, utilisez set(int index, E element).
fruits.set(1, "grape"); // The second element "banana" is replaced with "grape"
Suppression d’éléments (remove)
Vous pouvez également supprimer des éléments par un indice spécifique ou par l’élément lui‑même.
fruits.remove(0); // Removes the first element
fruits.remove("orange"); // Removes "orange" (only the first match)
Obtention de la taille de la List (size)
Le nombre actuel d’éléments peut être obtenu avec la méthode size().
System.out.println(fruits.size()); // Returns 2, etc.
Vérification de l’existence d’un élément (contains)
Pour vérifier si un élément spécifique est présent dans la List, utilisez contains().
if (fruits.contains("grape")) {
System.out.println("grape is present");
}
Résumé : Liste des opérations de base fréquemment utilisées
| Operation | Method Example | Description |
|---|---|---|
| Addition | add("element") | Adds to the end |
| Retrieval | get(index) | References an element |
| Update | set(index, new element) | Changes the element at the specified position |
| Removal | remove(index/element) | Removes the specified element |
| Get Size | size() | Gets the number of elements |
| Check Existence | contains("element") | Checks if a specific element exists |
4. Exemples d’opérations sur les Listes
Dans ce chapitre, nous présenterons des exemples d’opérations pratiques utilisant la List de Java. Il existe de nombreuses situations où vous souhaitez traiter les éléments d’une liste séquentiellement, et nous couvrirons ici les méthodes représentatives utilisant la boucle for, la boucle for‑enhancée et l’API Stream.
Itération avec une boucle for
La méthode la plus basique consiste à récupérer les éléments en utilisant un indice dans une boucle for.
List<String> fruits = new ArrayList<>();
fruits.add("apple");
fruits.add("banana");
fruits.add("orange");
for (int i = 0; i < fruits.size(); i++) {
System.out.println(fruits.get(i));
}
Cette méthode permet un contrôle fin grâce à l’indice. Par exemple, elle est efficace lorsque vous ne voulez traiter que les éléments aux indices pairs.
Itération avec une boucle for‑enhancée (for‑each)
Si vous souhaitez traiter tous les éléments séquentiellement sans vous soucier de l’indice, la boucle for‑enhancée est pratique.
for (String fruit : fruits) {
System.out.println(fruit);
}
La syntaxe est simple et facile à lire, ce qui en fait l’une des méthodes les plus couramment utilisées. Cela suffit pour un traitement simple.
Itération avec les expressions lambda et l’API Stream
Depuis Java 8, vous pouvez également utiliser la syntaxe avec l’API Stream et les expressions lambda.
fruits.stream().forEach(fruit -> System.out.println(fruit));
La force de cette notation est que plusieurs traitements peuvent être enchaînés. Par exemple, vous pouvez facilement filtrer puis afficher les éléments selon des critères spécifiques.
fruits.stream()
.filter(fruit -> fruit.contains("a"))
.forEach(System.out::println);
Dans cet exemple, il n’affiche que les fruits contenant « a ». C’est particulièrement recommandé pour ceux qui souhaitent s’habituer à la programmation fonctionnelle.
Choisir la bonne méthode
| Method | Advantages | Suitable Situations |
|---|---|---|
| Regular for loop | Allows index control | Processing that requires element numbers |
| Enhanced for loop | Simple and easy to read syntax | Simple iteration processing |
| Stream API | Strong for conditional and chained processing | When combining filtering, mapping, and reduction |
5. Différences et utilisation d’ArrayList et de LinkedList
Les classes représentatives qui implémentent l’interface List de Java sont ArrayList et LinkedList. Les deux peuvent être utilisées comme List de la même manière, mais elles diffèrent par leur structure interne et leurs caractéristiques de performance, il est donc important de les employer de façon appropriée selon les situations.
Caractéristiques et cas d’utilisation appropriés d’ArrayList
ArrayList utilise en interne un tableau dynamique (tableau redimensionnable).
Principales caractéristiques :
- Très rapide pour l’accès aléatoire (basé sur l’index)
- Ajouter des éléments à la fin de la liste est rapide (moyenne O(1))
- L’insertion et la suppression au milieu sont plus lentes (O(n))
Situations appropriées :
- Situations où la recherche (
get()) est fréquente - Situations où le nombre d’éléments peut être prédit dans une certaine mesure à l’avance
- Traitement où l’ajout/suppression d’éléments est minimal, en se concentrant sur la lecture
List<String> list = new ArrayList<>();
Caractéristiques et cas d’utilisation appropriés de LinkedList
LinkedList est implémentée avec une structure de liste doublement chaînée.
Principales caractéristiques :
- Rapide pour ajouter et supprimer des éléments (surtout au début ou à la fin)
- L’accès aléatoire (
get(index)) est lent (O(n)) - La consommation mémoire est légèrement supérieure à celle d’ArrayList
Situations appropriées :
- Situations où les éléments sont fréquemment insérés ou supprimés (surtout au début ou au milieu)
- Lorsque vous souhaitez l’utiliser comme une file d’attente (Queue) ou une pile (Stack)
- Lorsqu’on se concentre sur l’itération et que l’accès par index n’est pas nécessaire
List<String> list = new LinkedList<>();
Comparaison des performances
Le tableau suivant montre la complexité temporelle théorique (notation Big O) pour les opérations couramment utilisées.
| Operation | ArrayList | LinkedList |
|---|---|---|
get(int index) | O(1) | O(n) |
add(E e) (at the end) | O(1) | O(1) |
add(int index, E e) | O(n) | O(n) |
remove(int index) | O(n) | O(n) |
| Iteration | O(n) | O(n) |
* Le temps de traitement réel peut également être affecté par la taille des données, l’optimisation de la JVM, etc.

Points de différenciation pour l’utilisation pratique
- Si vous traitez les données comme une liste et y accédez par index, utilisez ArrayList
- Si l’insertion/suppression au début ou au milieu est fréquente, utilisez LinkedList
- Pour les traitements sensibles aux performances, effectuez toujours des benchmarks et vérifiez
6. Utilisation avancée de List
Ici, nous présenterons des techniques avancées pour utiliser la List de Java de manière encore plus pratique. List peut effectuer diverses opérations non seulement en tant que simple collection de données mais aussi via le tri, le mélange, le filtrage, la transformation, etc.
Tri d’une List (Collections.sort)
En utilisant Collections.sort(), vous pouvez trier les éléments d’une List par ordre croissant. Les éléments doivent implémenter l’interface Comparable.
import java.util.*;
List<String> fruits = new ArrayList<>();
fruits.add("banana");
fruits.add("apple");
fruits.add("orange");
Collections.sort(fruits);
System.out.println(fruits); // [apple, banana, orange]
Tri dans un ordre personnalisé (en utilisant Comparator)
fruits.sort(Comparator.reverseOrder()); // Sorts in descending order
Mélange d’une List (Collections.shuffle)
Pour réorganiser aléatoirement les éléments, vous pouvez utiliser Collections.shuffle().
Collections.shuffle(fruits);
System.out.println(fruits); // [banana, orange, apple] (example)
Ceci est utile lorsque vous voulez un jeu de cartes pour un jeu ou un ordre d’affichage aléatoire.
Filtrage avec l’API Stream (filter)
En utilisant Stream depuis Java 8, vous pouvez écrire de façon concise du code pour extraire uniquement les éléments qui correspondent à une condition.
List<String> filtered = fruits.stream()
.filter(fruit -> fruit.contains("a"))
.collect(Collectors.toList());
System.out.println(filtered); // [apple, banana, orange] (depending on original content and filter)
Transformation avec l’API Stream (map)
Pour transformer les éléments en un format différent, utilisez map().
List<Integer> lengths = fruits.stream()
.map(String::length)
.collect(Collectors.toList());
System.out.println(lengths); // Lengths of each fruit name [5, 6, 6] etc.
map() est un outil puissant pour la conversion de format de données et le prétraitement.
Résumé des opérations avancées
| Operation | Usage Example | Main Use Cases |
|---|---|---|
| Sort | Collections.sort(list) | Sort in ascending order |
| Shuffle | Collections.shuffle(list) | Randomize the order of elements |
| Filter | stream().filter(...).collect() | Extract only elements that match a condition |
| Transform | stream().map(...).collect() | Transform the type or value of elements |
7. Erreurs courantes et leurs solutions
Lorsqu’on travaille avec les List en Java, l’un des problèmes que les débutants rencontrent souvent sont les « exceptions (erreurs) ». Ici, nous expliquerons spécifiquement les erreurs représentatives qui surviennent fréquemment, leurs causes et comment les résoudre.
IndexOutOfBoundsException
Cause :
Se produit lorsqu’on tente d’accéder à un index qui n’existe pas.
List<String> list = new ArrayList<>();
list.add("apple");
System.out.println(list.get(1)); // Error: Index 1 out of bounds
Solution :
Vérifiez la taille avant d’accéder ou contrôlez l’accès avec une branche conditionnelle afin de garantir que l’index est valide.
if (list.size() > 1) {
System.out.println(list.get(1));
}
NullPointerException
Cause :
Se produit lorsqu’on appelle une méthode sur une List ou sur un élément de List qui est null.
List<String> list = null;
list.add("apple"); // NullPointerException occurs
Solution :
Vérifiez au préalable que la variable n’est pas nulle, ou utilisez Optional, etc.
if (list != null) {
list.add("apple");
}
De plus, faites attention à ne pas oublier d’initialiser :
List<String> list = new ArrayList<>(); // Correct initialization
ConcurrentModificationException
Cause :
Se produit lorsque la List est modifiée directement pendant son itération à l’aide d’une boucle for-each ou d’un Iterator.
for (String fruit : list) {
if (fruit.equals("banana")) {
list.remove(fruit); // ConcurrentModificationException
}
}
Solution :
Utilisez un Iterator pour supprimer les éléments en toute sécurité, ou utilisez des méthodes comme removeIf().
Iterator<String> it = list.iterator();
while (it.hasNext()) {
if (it.next().equals("banana")) {
it.remove(); // Safe removal
}
}
Ou, de façon plus concise depuis Java 8 :
list.removeIf(fruit -> fruit.equals("banana"));
Autres points à noter
- Vérifier que la List n’est pas nulle
- Il est très fréquent de déclarer une variable sans l’utiliser. L’initialisation est essentielle.
- Comprendre que les indices commencent à 0
- Les débutants pensent souvent à tort que « le premier élément a l’index 1 ».
Résumé des mesures correctives d’erreurs
| Error Name | Primary Cause | Example Solutions |
|---|---|---|
| IndexOutOfBoundsException | Accessing a non-existent index | Check length with size() |
| NullPointerException | List or element is null | Don’t forget initialization, perform null checks |
| ConcurrentModificationException | Directly modifying the List during iteration | Operate with Iterator or utilize removeIf() |
8. Conclusion
Revoir les bases de la List Java
Dans cet article, nous avons expliqué les bases jusqu’aux aspects avancés de la List en Java étape par étape. La List est particulièrement utilisée parmi les collections Java et constitue un outil important pour manipuler les données de manière flexible.
Tout d’abord, après avoir compris ce qu’est une List, nous avons appris les points suivants :
- La List est une collection ordonnée qui autorise les doublons et prend en charge les opérations d’indexation
- Il existe des classes d’implémentation représentatives telles que ArrayList et LinkedList, chacune avec des caractéristiques et des cas d’utilisation différents
- Maîtriser les opérations de base (add, get, update, remove, search) permet une manipulation flexible des données
- Traitement itératif adapté à la situation, tel que les boucles for, les boucles for améliorées et l’API Stream
- Prend en charge les opérations avancées telles que le tri, le filtrage et la transformation
- Comprendre les erreurs courantes, leurs causes et leurs solutions aide à prévenir les problèmes
Différencier l’utilisation d’ArrayList et de LinkedList
Choisir quelle implémentation de List utiliser est important et doit se baser sur le contenu du traitement et la quantité de données. Les critères suivants peuvent servir de guide :
- ArrayList : Accès aléatoire fréquent, principalement en lecture
- LinkedList : Insertion/suppression fréquente, l’ordre d’accès est important
Vers un apprentissage futur
La List n’est que le « point d’entrée » des collections Java. Pour gérer des structures de données et des utilitaires plus avancés, il est recommandé d’approfondir votre compréhension des classes et fonctionnalités suivantes :
- Set et Map : Gestion d’éléments uniques, structure de paires clé-valeur
- Classe utilitaire Collections : Tri, recherche du min/max, etc.
- Utilisation de l’API Stream : Introduction à la programmation fonctionnelle
- Comprendre les génériques : Opérations de collection sécurisées par le type
Maîtriser les bases de la List rendra votre programmation Java globale beaucoup plus facile à gérer.
Foire aux questions (FAQ)
Nous avons rassemblé les points sur lesquels les débutants ont souvent des questions concernant la List en Java. Nous avons sélectionné le contenu le plus fréquemment rencontré en pratique.
Q1. Quelle est la différence entre List et Array en Java ?
A. Un tableau possède un nombre d’éléments fixe et sa taille doit être déterminée lors de la déclaration. En revanche, une List a une taille variable, permettant d’ajouter et de supprimer des éléments de façon flexible. De plus, List propose de nombreuses méthodes pratiques (add, remove, contains, etc.) et offre une meilleure lisibilité et maintenabilité.
Q2. Dois‑je utiliser ArrayList ou LinkedList ?
A. ArrayList convient principalement lorsqu’il y a un accès aléatoire fréquent (récupération par indice). LinkedList est adaptée lorsque l’insertion et la suppression d’éléments sont fréquentes. En cas de doute, il est généralement recommandé de commencer avec ArrayList.
Q3. Puis‑je stocker des types primitifs (comme int ou double) dans une List ?
A. Pas directement. Comme List ne gère que des types objets, pour les types primitifs comme int il faut utiliser leurs classes enveloppantes correspondantes (Integer, Double, etc.).
List<Integer> numbers = new ArrayList<>();
numbers.add(10); // Auto-boxed and stored as Integer type
Q4. Comment trier les éléments d’une List ?
A. Vous pouvez trier en ordre croissant avec Collections.sort(list). De plus, si vous souhaitez un ordre personnalisé, vous pouvez spécifier un Comparator pour un tri flexible.
Q5. Que faire si je veux gérer des éléments sans doublons ?
A. List est une collection qui autorise les doublons. Si vous voulez éviter les doublons, envisagez d’utiliser un Set (par ex., HashSet). Notez toutefois que l’ordre n’est pas garanti. Si vous souhaitez supprimer les doublons tout en conservant une List, le traitement suivant avec les Streams est également possible :
List<String> distinctList = list.stream()
.distinct()
.collect(Collectors.toList());
Q6. Que faire pour vider tous les éléments d’une List ?
A. Vous pouvez supprimer tous les éléments d’une List en utilisant la méthode clear().
list.clear();
Q7. Quelles sont les opérations les plus fréquemment utilisées sur une List ?
A. Les opérations les plus couramment utilisées en pratique sont add (ajout), get (récupération), remove (suppression) et size (obtention de la taille). Maîtriser celles‑ci couvrira la plupart des traitements de base.

