HOWTO · Java
Enqueue et Dequeue en Java
Comprendre Enqueue et Dequeue en Java et toutes les autres informations pertinentes
Sur cette page
En Java, l’enqueue ajoute un élément à la fin d’une file FIFO, tandis que le dequeue retire l’élément situé en tête. L’interface Queue définit ces opérations, et LinkedList est l’une des classes qui l’implémentent. Utilisez offer et poll lorsque vous avez besoin de connaître, grâce à leur valeur de retour, si l’insertion a réussi ou si aucun élément n’était disponible en tête.
File d’attente et FIFO
Une file traite les éléments selon le principe du premier entré, premier sorti (FIFO) : la première valeur ajoutée est la première retirée. L’ajout se fait à la fin de la file, tandis que le retrait et la consultation se font en tête. Cet ordre est utile lorsqu’un programme doit traiter des tâches, des événements ou des messages dans leur ordre d’arrivée.
En Java, Queue est une interface du framework de collections. Elle définit les opérations habituelles d’une file sans imposer de stratégie de stockage particulière. Les implémentations peuvent avoir des limites de capacité et des caractéristiques de performance différentes ; choisissez donc celle qui convient à votre application au lieu de supposer que toutes les files se comportent de la même façon.
Pour en savoir plus sur cette règle d’ordre, consultez le guide des files FIFO en Java.
Enqueue et dequeue
Enqueue désigne l’opération qui ajoute un élément à la fin de la file. Dequeue désigne celle qui retire l’élément en tête. Ces termes décrivent des opérations sur une file ; ils ne signifient pas que l’interface Deque est la même chose qu’une opération de dequeue. Deque est une interface Java distincte pour les collections qui permettent l’ajout et le retrait aux deux extrémités.
Il est aussi possible de consulter l’élément en tête sans le retirer. Cela permet au code de déterminer ce qu’il doit traiter ensuite tout en conservant l’ordre de la file.
Méthodes de Queue en Java
Pour insérer un élément, add(E) et offer(E) l’ajoutent toutes deux si la file l’accepte. Leur comportement diffère lorsque la capacité est limitée : add lance IllegalStateException si cette limite empêche l’insertion, tandis que offer renvoie false. Une file sans limite de capacité fixe peut ne pas imposer de telle contrainte ; le résultat dépend donc de l’implémentation.
Pour retirer un élément, remove() récupère et retire celui qui se trouve en tête, mais lance NoSuchElementException si la file est vide. poll() récupère et retire également l’élément en tête, mais renvoie null s’il n’y en a aucun. Utilisez poll() lorsque la file vide est un état attendu que le code appelant doit gérer à partir de la valeur de retour.
element() et peek() consultent l’élément en tête sans le retirer. Si la file est vide, element() lance NoSuchElementException, tandis que peek() renvoie null. Ces deux méthodes permettent de choisir entre une exception explicite et une valeur de retour sentinelle. Comme poll() et peek() renvoient null pour signaler qu’aucun élément n’est disponible en tête, évitez de stocker null dans une file si votre logique doit distinguer ce résultat d’une valeur stockée.
Implémenter l’ajout et le retrait avec LinkedList
Le programme complet suivant utilise l’interface Queue<String> avec une implémentation LinkedList<String>. Il ajoute deux valeurs, consulte l’élément en tête, puis retire chaque valeur dans l’ordre FIFO.
import java.util.LinkedList;
import java.util.Queue;
public class QueueExample {
public static void main(String[] args) {
Queue<String> queue = new LinkedList<>();
queue.offer("First");
queue.offer("Second");
System.out.println("Head: " + queue.peek());
System.out.println("Removed: " + queue.poll());
System.out.println("Removed: " + queue.poll());
}
}
Head: First
Removed: First
Removed: Second
L’exécution consignée a produit la sortie affichée ci-dessus. La première consultation lit First sans le retirer, puis les deux appels à poll() retirent First, suivi de Second. Le type est déclaré comme Queue<String> afin que le code ne dépende que des opérations de file dont il a besoin ; LinkedList fournit l’implémentation concrète. D’autres implémentations de Queue peuvent être utilisées si leur capacité et leur ordre de traitement conviennent à l’application.
Le choix dépend principalement de la façon dont le code appelant doit gérer une file vide et les limites de capacité : utilisez offer, poll et peek lorsque leurs valeurs de retour font partie du déroulement normal du programme, ou add, remove et element lorsque la condition exceptionnelle correspondante doit être signalée au code appelant.