ArrayList よりも Queue を使用する基本的な引数の 1 つは、Queue が FIFO の動作を保証するということです。
しかし、ArrayList に 10 個の要素を追加し、0 番目の要素から始まる要素を反復処理すると、追加されたのと同じ順序で要素が取得されます。本質的に、それは FIFO 動作を保証します。
従来の ArrayList と比較して Queue の特別な点は何ですか?
ここで javadocを見ることができます。主な違いは、List
いつでも任意の要素を表示できることです。キューでは、「次の」キューのみを見ることができます。
実際の列、または食料品店のレジの列と考えてください。真ん中や最後にいる人に次に支払うように頼むのではなく、常に前にいる/最も長く待っている人に支払います.
一部のリストはキューであることに注意してください。たとえば、 LinkedListを見てください。
インスタンスを指定すると、繰り返し呼び出しを行うことで要素が FIFO 順に取得Queue
されることがわかります。remove()
私があなたにArrayList
インスタンスを与えた場合、あなたはそのような保証をすることはできません.
例として、次のコードを取り上げます。
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);
このリストをあなたに渡すとしたら、0 から 4 まで繰り返しても、FIFO 順で要素を取得することはできません。
また、もう1つの違いは抽象化です。インスタンスを使用するQueue
と、インデックスについて心配する必要がなくなります。これにより、すべてを提供する必要がない場合でも、簡単に考えることができArrayList
ます。
キューに課される制限 (FIFO、ランダム アクセスなし) は、ArrayList と比較して、データ構造をより最適化し、同時実行性を向上させ、必要に応じてより適切でクリーンな設計にすることができます。
最適化と並行性に関して、コンシューマーが消費している間にプロデューサーがキューを埋めているという一般的なシナリオを想像してみてください。これに ArrayList を使用した場合、単純な実装では、最初の要素を削除するたびに ArrayList でシフト操作が発生し、他のすべての要素が下に移動します。リストはシフト操作全体の間ロックされるため、これは特に同時実装では非常に非効率的です。
設計に関しては、項目が FIFO 方式でアクセスされる場合、キューを使用するとその意図が自動的に伝達されますが、リストではそうではありません。この明確なコミュニケーションにより、コードの理解が容易になり、コードがより堅牢になり、バグがなくなる可能性があります。
はい!
キューで poll() および peek() メソッドを使用して、値を返すだけでなく、それぞれ remove を返し、ヘッド要素を調べます。また、これらのメソッドは、操作が失敗し、例外をスローしない場合、特別な値 null を提供します。 remove() メソッドを使用すると、nosuchelement 例外がスローされます。
参照: docs.oracle.com
違いは、Queue の場合、要素を FIFO 順で引き出すことが保証されていることです。ArrayList の場合、要素が追加された順序はわかりません。使い方によっては、ArrayList で FIFO の順序付けを強制できます。また、必要な要素を引き出すことができる Queue のラッパーを設計することもできました。
私が言おうとしている点は、これらのクラスは何かが得意になるように設計されているということです。そのためにそれらを使用する必要はありませんが、それが設計され、最適化されているものです。キューは要素の追加と削除には非常に適していますが、それらを検索する必要がある場合はうまくいきません。一方、ArrayLists は要素の追加が少し遅くなりますが、簡単にランダム アクセスできます。作成するほとんどのアプリケーションでは見られませんが、どちらかを選択するとパフォーマンスが低下することがよくあります。
たとえば、Queue
メソッドpoll()
をremove()
使用して要素を取得し、キューから削除します。
Queue
インターフェイス ( )の一部の実装ではPriorityQueue
、要素に優先度を設定し、この優先度のおかげで要素を取得できます。最後のケースでは、FIFO の動作をはるかに超えています。