Introduction à Java ArrayDeque

Introduction à la Java ArrayDeque

1. Vue d'ensemble

Dans ce didacticiel, nous allons montrer comment utiliser la classe JavaArrayDeque, qui est une implémentation de l’interfaceDeque.

UnArrayDeque (également appelé «Array Double Ended Queue», prononcé «ArrayDeck»)is a special kind of a growable array that allows us to add or remove an element from both sides.

Une implémentationArrayDeque peut être utilisée comme unStack (dernier entré, premier sorti) ou unQueue (premier entré, premier sorti).

2. L'API en un coup d'œil

Pour chaque opération, nous avons essentiellement deux options.

Le premier groupe est constitué de méthodes qui lèvent une exception en cas d'échec de l'opération. L'autre groupe renvoie un statut ou une valeur:

Opération

Méthode

Exception de lancement de méthode

Insertion depuis la tête

offerFirst (e)

addFirst (e)

Retrait de la tête

pollFirst ()

removeFirst ()

Récupération de la tête

peekFirst ()

getFirst ()

Insertion depuis la queue

offerLast (e)

addLast (e)

Retrait de la queue

pollLast ()

removeLast ()

Récupération de la queue

peekLast ()

getLast ()

3. Utilisation de méthodes

Regardons quelques exemples simples de la façon dont nous pouvons utiliser lesArrayDeque.

3.1. Utilisation deArrayDeque commeStack

Nous allons commencer par un exemple de la façon dont nous pouvons traiter la classe comme unStack - et pousser un élément:

@Test
public void whenPush_addsAtFirst() {
    Deque stack = new ArrayDeque<>();
    stack.push("first");
    stack.push("second");

    assertEquals("second", stack.getFirst());
}

Voyons également comment nous pouvons extraire un élément duArrayDeque - lorsqu'il est utilisé comme pile:

@Test
public void whenPop_removesLast() {
    Deque stack = new ArrayDeque<>();
    stack.push("first");
    stack.push("second");

    assertEquals("second", stack.pop());
}

La méthodepop renvoieNoSuchElementException lorsqu'une pile est vide.

3.2. Utilisation deArrayDeque commeQueue

Commençons maintenant par un exemple simple montrant comment nous pouvons offrir un élément dans unArrayDeque - lorsqu'il est utilisé comme un simpleQueue:

@Test
public void whenOffer_addsAtLast() {
    Deque queue = new ArrayDeque<>();
    queue.offer("first");
    queue.offer("second");

    assertEquals("second", queue.getLast());
}

Et voyons comment nous pouvons interroger un élément à partir d'unArrayDeque, également lorsqu'il est utilisé comme unQueue:

@Test
public void whenPoll_removesFirst() {
    Deque queue = new ArrayDeque<>();
    queue.offer("first");
    queue.offer("second");

    assertEquals("first", queue.poll());
}

La méthodepoll renvoie une valeurnull si une file d'attente est vide.

4. CommentArrayDeque est-il mis en œuvre?

image Sous le capot, lesArrayDeque is backed by an array which doubles its size when it gets filled.

Initialement, le tableau est initialisé avec une taille de 16. Il est implémenté sous la forme d’une file d’attente à deux extrémités où il gère deux pointeurs, à savoir une tête et une queue.

Voyons cette logique en action - à un niveau élevé.

4.1. ArrayDeque comme pile

image Comme on peut le voir, lorsqu'un utilisateur ajoute un élément en utilisant la méthodepush, il déplace le pointeur de tête d'une unité.

Lorsque nous sautons un élément, il définit l'élément à la position de la tête en tant quenull afin que l'élément puisse être ramassé, puis recule le pointeur de tête de un.

4.2. ArrayDeque enQueue

image Lorsque nous ajoutons un élément en utilisant la méthodeoffer, cela déplace le pointeur de queue d'une unité.

Lorsque l'utilisateur interroge un élément, il définit la position de l'en-tête sur null afin que l'élément puisse être récupéré, puis déplace le pointeur de l'en-tête.

4.3. Remarques surArrayDeque

Enfin, quelques notes supplémentaires méritant d'être comprises et rappelées à propos de cette implémentation particulière:

  • Ce n’est pas compatible avec les threads

  • Les éléments nuls ne sont pas acceptés

  • Fonctionne beaucoup plus rapidement que lesStack synchronisés

  • Est une file d'attente plus rapide queLinkedList en raison de la meilleure localité de référence

  • La plupart des opérations ont amorti la complexité en temps constant

  • UnIterator renvoyé par unArrayDeque est en échec rapide

  • ArrayDeque double automatiquement la taille d'un tableau lorsque les pointeurs de tête et de queue se rencontrent lors de l'ajout d'un élément

5. Conclusion

Dans ce court article, nous avons illustré l'utilisation des méthodes enArrayDeque.

L'implémentation de tous ces exemples peut être trouvée dansthe GitHub project; il s'agit d'un projet basé sur Maven, il devrait donc être facile à importer et à exécuter tel quel.