Méthode add() de Java LinkedList
La classe LinkedList fournit plusieurs versions surchargées de la méthode add() pour ajouter des éléments à la liste.
1、boolean add(E e)
Il s'agit de la méthode add la plus basique, qui ajoute l'élément spécifié à la fin de la liste.
Exemple
LinkedList<String> list = new LinkedList<>();
list.add("Apple");
list.add("Banana");
list.add("Cherry");
list.add("Apple");
list.add("Banana");
list.add("Cherry");
Caractéristiques de la méthode:
- Renvoie toujours true (car LinkedList autorise les éléments en double)
- La complexité temporelle est O(1)
- Équivalent à la méthode addLast()
2、void add(int index, E element)
Insère l'élément spécifié à la position spécifiée dans la liste.
Exemple
LinkedList<String> list = new LinkedList<>();
list.add("Apple");
list.add("Banana");
list.add(1, "Orange"); // Insérer à l'index 1
list.add("Apple");
list.add("Banana");
list.add(1, "Orange"); // Insérer à l'index 1
Caractéristiques de la méthode:
- Si l'index est égal à la taille de la liste, cela équivaut à add(E e)
- Nécessite un parcours jusqu'à la position spécifiée, avec une complexité temporelle moyenne de O(n)
- Peut lever IndexOutOfBoundsException
3、boolean addAll(Collection<? extends E> c)
Ajoute tous les éléments de la collection spécifiée à la fin de la liste, dans l'ordre renvoyé par son itérateur.
Exemple
LinkedList<String> fruits = new LinkedList<>();
fruits.add("Pomme");
fruits.add("Banane");
List<String> moreFruits = Arrays.asList("Orange", "Grape");
fruits.addAll(moreFruits);
fruits.add("Pomme");
fruits.add("Banane");
List<String> moreFruits = Arrays.asList("Orange", "Grape");
fruits.addAll(moreFruits);
Caractéristiques de la méthode:
- Renvoie true si la liste a été modifiée à la suite de l'appel
- La complexité temporelle est O(m), où m est la taille de la collection passée en paramètre
4、boolean addAll(int index, Collection<? extends E> c)
Insère tous les éléments de la collection spécifiée dans cette liste, en commençant à la position spécifiée.
Exemple
LinkedList<String> fruits = new LinkedList<>();
fruits.add("Pomme");
fruits.add("Banane");
List<String> moreFruits = Arrays.asList("Orange", "Grape");
fruits.addAll(1, moreFruits); // Insérer la collection à l'index 1
fruits.add("Pomme");
fruits.add("Banane");
List<String> moreFruits = Arrays.asList("Orange", "Grape");
fruits.addAll(1, moreFruits); // Insérer la collection à l'index 1
Caractéristiques de la méthode:
- Nécessite d'abord de parcourir jusqu'à la position spécifiée
- La complexité temporelle est O(n + m), où n est la taille de la liste et m est la taille de la collection
Comparaison avec d'autres méthodes
add() vs addLast()
add(E e)etaddLast(E e)Complètement équivalents- Les deux servent à ajouter des éléments à la fin de la liste
add() vs offer()
add(E e)Peut lever une exception dans une file d'attente à capacité limitéeoffer(E e)Renvoie false au lieu de lever une exception dans une file d'attente à capacité limitée
add() vs push()
push(E e)En faitaddFirst(E e)- Ajoute l'élément au début de la liste au lieu de la fin
Considérations de performance
Efficacité des opérations d'ajout
- Ajout à la fin: complexité temporelle O(1)
- Ajout au début: complexité temporelle O(1) (en utilisant addFirst())
- Ajout au milieu: complexité temporelle O(n) (nécessite un parcours jusqu'à la position spécifiée)
Comparaison avec ArrayList
| Opération | LinkedList | ArrayList |
|---|---|---|
| Ajout à la fin | O(1) | O(1) amorti |
| Ajout au début | O(1) | O(n) |
| Ajout au milieu | O(n) | O(n) |
| Accès aléatoire | O(n) | O(1) |
Exemples d'applications pratiques
Création d'une liste de tâches
Exemple
LinkedList<String> todoList = new LinkedList<>();
// Ajouter une tâche
todoList.add("Faire les courses");
todoList.addFirst("Vérifier les e-mails"); // Tâche prioritaire
todoList.add(1, "Appeler maman"); // Priorité moyenne
System.out.println(todoList);
// Sortie : [Vérifier les e-mails, Appeler maman, Faire les courses]
// Ajouter une tâche
todoList.add("Faire les courses");
todoList.addFirst("Vérifier les e-mails"); // Tâche prioritaire
todoList.add(1, "Appeler maman"); // Priorité moyenne
System.out.println(todoList);
// Sortie : [Vérifier les e-mails, Appeler maman, Faire les courses]
Implémentation d'une file d'attente simple
Exemple
LinkedList<String> queue = new LinkedList<>();
// Opération d'enfilement
.add("Premier");
queue.add("Second");
queue.add("Third");
// Opération de retrait
while(!queue.isEmpty()) {
System.out.println(queue.removeFirst());
}
// Opération d'enfilement
.add("Premier");
queue.add("Second");
queue.add("Third");
// Opération de retrait
while(!queue.isEmpty()) {
System.out.println(queue.removeFirst());
}
Fusion de deux listes
Exemple
LinkedList<String> list1 = new LinkedList<>(Arrays.asList("A", "B", "C"));
LinkedList<String> list2 = new LinkedList<>(Arrays.asList("D", "E", "F"));
list1.addAll(list2);
System.out.println(list1); // Sortie: [A, B, C, D, E, F]
LinkedList<String> list2 = new LinkedList<>(Arrays.asList("D", "E", "F"));
list1.addAll(list2);
System.out.println(list1); // Sortie: [A, B, C, D, E, F]
Notes
- Sécurité des threads: LinkedList n'est pas thread-safe et nécessite une synchronisation externe dans un environnement multithread
- Éléments null: L'ajout d'éléments null est autorisé
- Vérification des index: Faites attention aux conditions aux limites lors de l'utilisation de la méthode add avec un index
- Modification concurrente: Modifier la liste pendant l'utilisation d'un itérateur lèvera ConcurrentModificationException
Java LinkedList