web-dev-qa-db-fra.com

Quand utiliser la file d'attente sur un arraylist

Un argument de base pour utiliser une file d'attente sur une liste de tableaux est que Queue garantit le comportement FIFO. 

Mais si j'ajoute 10 éléments à un ArrayList et que je répète ensuite les éléments à partir du 0ème élément, je récupèrerai les éléments dans le même ordre que lors de leur ajout. Donc, essentiellement, cela garantit un comportement FIFO.

Quelle est la particularité de Queue par rapport à ArrayList traditionnel?

17
Victor

Si je vous donnais une instance Queue, vous sauriez qu'en appelant de manière itérative remove(), vous récupérez les éléments dans l'ordre FIFO. Si je vous ai donné une instance ArrayList, vous ne pouvez faire aucune telle garantie.

Prenez le code suivant comme exemple:

        ArrayList<Integer> list = new ArrayList<Integer>();
    list.add(5);
    list.add(4);
    list.add(3);
    list.add(2);
    list.add(1);


    list.set(4,5);
    list.set(3,4);
    list.set(2,3);
    list.set(1,2);
    list.set(0,1);

    System.out.println(list);

Si je devais maintenant vous donner cette liste, alors, en effectuant une itération de 0 à 4, vous n'obtiendrez pas les éléments dans l'ordre FIFO.

En outre, je dirais qu'une autre différence est l'abstraction. Avec une instance Queue, vous n'avez pas à vous soucier des index, ce qui facilite la réflexion si vous n'avez pas besoin de tout ce que ArrayList a à offrir.

15
Lee Martie

Vous pouvez regarder le javadoc ici . La principale différence est que List vous permet de regarder n’importe quel élément à tout moment. Une file d’attente ne vous permet de regarder que la suivante. 

Pensez-y comme une vraie file d'attente ou comme une ligne pour la caisse enregistreuse d'une épicerie. Vous ne demandez pas au gars au milieu ou à la fin de payer ensuite, vous demandez toujours au gars qui est devant/attend depuis très longtemps. 

Il est à noter que certaines listes sont des files d'attente. Regardez LinkedList , par exemple. 

16
Daniel Kaplan

Les limitations imposées à une file d'attente (FIFO, pas d'accès aléatoire), par rapport à une ArrayList, permettent d'optimiser la structure de données, d'améliorer la concurrence et de créer un design plus approprié et plus clair à la demande.

En ce qui concerne l'optimisation et la concurrence, imaginez le scénario courant dans lequel un producteur remplit une file d'attente alors qu'un consommateur le consomme. Si nous utilisions une liste de tableaux pour cela, dans la mise en œuvre naïve, chaque suppression du premier élément entraînerait une opération de décalage sur la liste de tableaux afin de réduire tous les autres éléments. Cela est très inefficace, en particulier dans une mise en œuvre simultanée, car la liste serait verrouillée pendant toute la durée de l’opération de décalage.

En ce qui concerne la conception, si les éléments doivent être accédés de manière FIFO, l'utilisation d'une file d'attente communique automatiquement cette intention, contrairement à une liste. Cette clarté de la communication facilite la compréhension du code et peut éventuellement le rendre plus robuste et sans bug.

6
Trevor Freeman

La différence est que pour une file d'attente, vous êtes assuré d'extraire les éléments dans l'ordre FIFO. Pour un ArrayList, vous n'avez aucune idée de l'ordre dans lequel les éléments ont été ajoutés. Selon l'utilisation que vous en faites, vous pouvez appliquer l'ordre FIFO sur une ArrayList. Je pouvais aussi concevoir un wrapper pour une file d’attente qui me permettait d’extraire l’élément de mon choix.

Ce que j'essaie de dire, c'est que ces cours sont conçus pour être performants. Vous n'avez pas à les utiliser pour cela, mais c'est pour cela qu'ils ont été conçus et optimisés. Les files d'attente sont très efficaces pour ajouter et supprimer des éléments, mais mauvaises si vous devez les parcourir. Les listes de tableaux, en revanche, sont un peu plus lentes pour ajouter des éléments, mais permettent un accès aléatoire facile. Vous ne le verrez pas dans la plupart des applications que vous écrivez, mais il est souvent pénalisant en termes de performances de choisir l’une sur l’autre.

1
specs

Oui!

J'aurais utilisé les méthodes poll () et peek () dans la file d'attente qui renvoie la valeur ainsi que l'élément remove, examine et head respectivement. De plus, ces méthodes vous fournissent une valeur spéciale null si l'opération échoue et ne lève pas d'exception avec la méthode remove () lève nosuchelement exception.

Réf .: docs.Oracle.com 

1
Ankish

Prenons une situation dans laquelle des processus aléatoires mettent à jour un arraylist de manière aléatoire et que nous sommes supposés les traiter dans fifo?

Il n'y a absolument aucun moyen de le faire, mais de changer la structure de données d'arraylist en file d'attente.

Par exemple, les méthodes Queue, poll() et remove() récupèrent l'élément et le suppriment de la file d'attente.

Certaines implémentations de l'interface Queue (PriorityQueue) permettent de définir une priorité pour les éléments et de les récupérer grâce à cette priorité. C'est beaucoup plus qu'un comportement FIFO dans ce dernier cas.

0
eternay