投稿 2022年4月30日
更新 2022年4月30日
専門用語の数:少
ざっくり言うと、一方通行の道路です。
Uターンは禁止(というかそんな幅ないでしょうし)で、もちろんバックも禁止です。
追い抜かすこともできないので、必ず入った順番通りに出てくます。
だいたいそんな感じです。
このことをFIFO(First In First Out)とも呼びます。
最初に(First)入った(In)ものが、最初に(First)出る(Out)感じです。
デックと読みます(デキューじゃないのか)
さきほどのQueueと対になる存在で、LIFO(Last In First Out)とも呼ばれます。
最後に(Last)入った(In)ものが、最初に(First)出る(Out)感じです。
※FILOともいいますが、真逆の言い方してるだけで一緒の意味です。
何かが積み重なっていくイメージですね。
一方通行の道路だと思ったら、行き止まりやんけ!みたいな状況です。
出ようにも後ろに車がいたら、後ろの車から出て行ってもらうしかないですね。
ただDequeは実はQueueを拡張しているものになるので、FIFO・LIFO両方使うことができます。
そのため、Dequeを使用することが多いかと思います。
なんせそのほうが便利ですからね。
QueueやDequeとはあくまで入れ物のようなもの(インターフェース)なだけで、
実際動作する実物は以下の通りです。
一般的な両端キュー(FIFO・LIFO)
自然な順序付けで優先順位を決める優先キュー
今回は紹介だけですが、マルチスレッドに対応したQueueも存在します。
「BlockingQueue」「BlockingDeque」「TransferQueue」というインターフェースで、
「LinkedBlockingQueue」「LinkedBlockingDeque」「LinkedTransferQueue」
「ArrayBlockingQueue」「SynchronousQueue」「DelayQueue」「PriorityBlockingQueue」
などと、なんかすごいいっぱいあります・・・。
もしマルチスレッドを使用する環境で使用するのであれば、こういう事を考慮しないといけません。
一般的に下記のような宣言を見ることが多いかと思います。
このように、QueueやDequeの中に実物を入れていることが多いと思います。
ただ同じ型に入れることももちろん可能です。
どう違うのかと言うと、使える機能が違います。
細かくいえば他にも違いはありますが、基本的にはQueueやDeque等のインターフェースに格納し、
必要に応じてインターフェースに無い機能を使いたい時だけArrayDeque等を使用するイメージで大丈夫だと思います。
そのため以下は全てQueueやDequeに格納しております。
まずQueueやDequeの中身のことは「要素」と呼びます。
Queueオブジェクトを初期化(生成)します。
基本的に引数は指定しなくてもいいですが、「初期容量」を指定できます。
何かというと、オブジェクト生成時にまず、初期容量分の保存領域を確保します。
そして要素を追加していく中で、初期容量の負荷係数個に到達すると、保存領域を拡張します。
この要領を拡張するという動作が非常に重たい動作になるので、できる限り最適に設定していきたいので、
最初からある程度量が分かっているのであれば、指定してあげるとパフォーマンスがよくなります。
要素を追加するときは、一番最初か一番最後に追加することになります。
「add」は、追加に失敗した場合、例外が発生します。
「offer」は、追加に成功した場合はtrueを、失敗した場合はfalseを返却してくれます。
要素の一番最初か一番最後を取得しつつ削除します。
「remove」は、取得(削除)に成功した場合は取得した値を返却し、失敗した場合は例外が発生します。
「poll」は、取得(削除)に成功した場合は取得した値を、追加に失敗した場合はnullを返却してくれます。
要素の一番最初か一番最後を取得します。
先ほどとは違い、取得するだけで削除はされません。
「get」は、取得に成功した場合は取得した値を返却し、失敗した場合は例外が発生します。
「peek」は、取得に成功した場合は取得した値を、追加に失敗した場合はnullを返却してくれます。
QueueやDeque内の要素の数を取得します。
取得できる数は人間が数える数字と同じなので、1個・2個と数えるやり方と同じです。
QueueやDequeに要素があるかどうかを判定します。
ただし完全一致しないと存在しないと判定されます。
例だと「車A」に「車」は含まれてはいますが、
完全一致はしないので、containsはfalseを返します。
先ほどまでDequeで動かしていましたが、もちろんQueueとしてでも動かせます。
ただ最初か最後、どちらに追加されるかを意識しないと、少しわかりにくいです。
使い方は、Dequeで紹介したメソッドの「First」「Last」がないバージョンです。
Javaのコレクションの「Queue」「Deque」の紹介でした。
QueueやDequeに限らずにJavaのコレクションを使いこなせれば、
楽に処理を実装できますし、わかりやすく書けますので、WinWinです。
使いこなせれば世界が変わるといっても過言ではないと思います!
以上、ここまで見ていただきありがとうございます。
皆さまの快適な開発ライフに、ほんの少しでもお役に立てれば幸いです。
コメント一覧