Java のキュー インターフェイス
キューインターフェイスは次の場所にあります。 java.util パッケージ化して拡張します コレクションインターフェース 処理される要素を FIFO (First In First Out) 順序で保持するために使用されます。これはオブジェクトの順序付きリストであり、その用途はリストの最後に要素を挿入し、リストの先頭から要素を削除することに限定されています。 FIFO または先入れ先出しの原則。
キューはインターフェイスであるため、宣言用の具象クラスが必要です。最も一般的なクラスは次のとおりです。 優先キュー そして リンクリスト ジャワでは。これらの実装はどちらもスレッドセーフではないことに注意してください。 優先ブロッキングキュー スレッドセーフな実装が必要な場合の代替実装の 1 つです。
宣言: Queue インターフェースは次のように宣言されます。
public interface Queue extends Collection
キューオブジェクトの作成: 以来 列 です インターフェース 、キュータイプのオブジェクトは作成できません。オブジェクトを作成するには、このリストを拡張するクラスが常に必要です。そして、導入後も、 ジェネリック Java 1.5 では、キューに格納できるオブジェクトのタイプを制限できます。このタイプセーフなキューは次のように定義できます。
// Obj is the type of the object to be stored in Queue Queue queue = new PriorityQueue ();
Java では、Queue インターフェイスは Collection インターフェイスのサブタイプであり、特定の順序で要素のコレクションを表します。これは先入れ先出し (FIFO) の原則に従います。これは、要素がキューに追加された順序で取得されることを意味します。
Queue インターフェイスは、キュー内の要素を追加、削除、検査するためのいくつかのメソッドを提供します。最も一般的に使用される方法のいくつかを次に示します。
add(element): キューの後ろに要素を追加します。キューがいっぱいの場合は、例外がスローされます。
Offer(element): キューの最後尾に要素を追加します。キューがいっぱいの場合は false を返します。
Remove(): キューの先頭にある要素を削除して返します。キューが空の場合、例外がスローされます。
poll(): キューの先頭にある要素を削除して返します。キューが空の場合は null を返します。
element(): キューの先頭にある要素を削除せずに返します。キューが空の場合、例外がスローされます。
Peak(): キューの先頭にある要素を削除せずに返します。キューが空の場合は null を返します。
Queue インターフェイスは、LinkedList、ArrayDeque、PriorityQueue などの Java のいくつかのクラスによって実装されます。これらの各クラスは、異なるパフォーマンス特性と機能を備えたキュー インターフェイスの異なる実装を提供します。
全体として、Queue インターフェイスは、要素のコレクションを特定の順序で管理するための便利なツールであり、多くの異なるアプリケーションや業界で広く使用されています。
例:
ジャワ
import> java.util.LinkedList;> import> java.util.Queue;> public> class> QueueExample {> > public> static> void> main(String[] args) {> > Queue queue => new> LinkedList();> > // add elements to the queue> > queue.add(> 'apple'> );> > queue.add(> 'banana'> );> > queue.add(> 'cherry'> );> > // print the queue> > System.out.println(> 'Queue: '> + queue);> > // remove the element at the front of the queue> > String front = queue.remove();> > System.out.println(> 'Removed element: '> + front);> > // print the updated queue> > System.out.println(> 'Queue after removal: '> + queue);> > // add another element to the queue> > queue.add(> 'date'> );> > // peek at the element at the front of the queue> > String peeked = queue.peek();> > System.out.println(> 'Peeked element: '> + peeked);> > // print the updated queue> > System.out.println(> 'Queue after peek: '> + queue);> > }> }> |
出力
Queue: [apple, banana, cherry] Removed element: apple Queue after removal: [banana, cherry] Peeked element: banana Queue after peek: [banana, cherry, date]
例: 列
ジャワ
// Java program to demonstrate a Queue> import> java.util.LinkedList;> import> java.util.Queue;> public> class> QueueExample {> > public> static> void> main(String[] args)> > {> > Queue q> > => new> LinkedList();> > // Adds elements {0, 1, 2, 3, 4} to> > // the queue> > for> (> int> i => 0> ; i <> 5> ; i++)> > q.add(i);> > // Display contents of the queue.> > System.out.println(> 'Elements of queue '> > + q);> > // To remove the head of queue.> > int> removedele = q.remove();> > System.out.println(> 'removed element-'> > + removedele);> > System.out.println(q);> > // To view the head of queue> > int> head = q.peek();> > System.out.println(> 'head of queue-'> > + head);> > // Rest all methods of collection> > // interface like size and contains> > // can be used with this> > // implementation.> > int> size = q.size();> > System.out.println(> 'Size of queue-'> > + size);> > }> }> |
出力
Elements of queue [0, 1, 2, 3, 4] removed element-0 [1, 2, 3, 4] head of queue-1 Size of queue-4
キューインターフェイスの操作
を使用して、キューに対して頻繁に使用されるいくつかの操作を実行する方法を見てみましょう。 プライオリティキュークラス 。
1. 要素の追加: キューに要素を追加するには、 add() メソッド 。広告掲載オーダーは PriorityQueue には保持されません。要素は、デフォルトでは昇順の優先順位に基づいて保存されます。
例
ジャワ
// Java program to add elements> // to a Queue> import> java.util.*;> public> class> GFG {> > public> static> void> main(String args[])> > {> > Queue pq => new> PriorityQueue();> > pq.add(> 'Geeks'> );> > pq.add(> 'For'> );> > pq.add(> 'Geeks'> );> > System.out.println(pq);> > }> }> |
出力
[For, Geeks, Geeks]
2. 要素の削除: キューから要素を削除するには、 削除()メソッド。 このようなオブジェクトが複数ある場合は、最初に出現したオブジェクトが削除されます。それとは別に、poll() メソッドは、ヘッドを削除してそれを返すためにも使用されます。
例
ジャワ
// Java program to remove elements> // from a Queue> import> java.util.*;> public> class> GFG {> > public> static> void> main(String args[])> > {> > Queue pq => new> PriorityQueue();> > pq.add(> 'Geeks'> );> > pq.add(> 'For'> );> > pq.add(> 'Geeks'> );> > System.out.println(> 'Initial Queue '> + pq);> > pq.remove(> 'Geeks'> );> > System.out.println(> 'After Remove '> + pq);> > System.out.println(> 'Poll Method '> + pq.poll());> > System.out.println(> 'Final Queue '> + pq);> > }> }> |
出力
Initial Queue [For, Geeks, Geeks] After Remove [For, Geeks] Poll Method For Final Queue [Geeks]
3. キューを反復する: キューを反復処理するには複数の方法があります。最も有名な方法は、キューを配列に変換し、for ループを使用して走査する方法です。ただし、キューには、キューを反復処理するために使用できる組み込みイテレータもあります。
例
ジャワ
// Java program to iterate elements> // to a Queue> import> java.util.*;> public> class> GFG {> > public> static> void> main(String args[])> > {> > Queue pq => new> PriorityQueue();> > pq.add(> 'Geeks'> );> > pq.add(> 'For'> );> > pq.add(> 'Geeks'> );> > Iterator iterator = pq.iterator();> > while> (iterator.hasNext()) {> > System.out.print(iterator.next() +> ' '> );> > }> > }> }> |
出力
For Geeks Geeks
キューの特徴: キューの特徴は次のとおりです。
- キューは、キューの最後に要素を挿入し、キューの先頭から要素を削除するために使用されます。 FIFO の概念に従っています。
- Java キューは、挿入、削除などを含む Collection インターフェースのすべてのメソッドをサポートします。
- リンクリスト 、ArrayBlockingQueue、および 優先キュー 最も頻繁に使用される実装です。
- BlockingQueues に対して null 操作が実行されると、NullPointerException がスローされます。
- java.util パッケージで使用できるキューは、Unbounded Queue です。
- java.util.concurrent パッケージで使用できるキューは、Bounded Queue です。
- Deque を除くすべてのキューは、キューの末尾と先頭でそれぞれ挿入と削除をサポートします。 Deques は、両端で要素の挿入と削除をサポートします。
キュー インターフェイスを実装するクラス:
1. 優先キュー: コレクション フレームワークに実装されている PriorityQueue クラスは、優先度に基づいてオブジェクトを処理する方法を提供します。キューが先入れ先出しアルゴリズムに従うことは知られていますが、優先度に従ってキューの要素を処理する必要がある場合があります。その場合には、PriorityQueue が機能します。このクラスを使用してキュー オブジェクトを作成する方法を見てみましょう。
例
ジャワ
// Java program to demonstrate the> // creation of queue object using the> // PriorityQueue class> import> java.util.*;> class> GfG {> > public> static> void> main(String args[])> > {> > // Creating empty priority queue> > Queue pQueue> > => new> PriorityQueue();> > // Adding items to the pQueue> > // using add()> > pQueue.add(> 10> );> > pQueue.add(> 20> );> > pQueue.add(> 15> );> > // Printing the top element of> > // the PriorityQueue> > System.out.println(pQueue.peek());> > // Printing the top element and removing it> > // from the PriorityQueue container> > System.out.println(pQueue.poll());> > // Printing the top element again> > System.out.println(pQueue.peek());> > }> }> |
出力
10 10 15
2. リンクされたリスト: LinkedList は、本質的に 例
ジャワ
// Java program to demonstrate the> // creation of queue object using the> // LinkedList class> import> java.util.*;> class> GfG {> > public> static> void> main(String args[])> > {> > // Creating empty LinkedList> > Queue ll> > => new> LinkedList();> > // Adding items to the ll> > // using add()> > ll.add(> 10> );> > ll.add(> 20> );> > ll.add(> 15> );> > // Printing the top element of> > // the LinkedList> > System.out.println(ll.peek());> > // Printing the top element and removing it> > // from the LinkedList container> > System.out.println(ll.poll());> > // Printing the top element again> > System.out.println(ll.peek());> > }> }> |
出力
10 10 20
3. 優先ブロッキングキュー: PriorityQueue と LinkedList の両方の実装がスレッドセーフではないことに注意してください。 PriorityBlockingQueue は、スレッドセーフな実装が必要な場合の代替実装の 1 つです。 PriorityBlockingQueue は、クラスと同じ順序付けルールを使用する無制限のブロッキング キューです。 優先キュー そして、ブロック取得操作を提供します。
制限がないため、リソースの枯渇により要素の追加が失敗する場合があります。 メモリ不足エラー 。このクラスを使用してキュー オブジェクトを作成する方法を見てみましょう。
例
ジャワ
// Java program to demonstrate the> // creation of queue object using the> // PriorityBlockingQueue class> import> java.util.concurrent.PriorityBlockingQueue;> import> java.util.*;> class> GfG {> > public> static> void> main(String args[])> > {> > // Creating empty priority> > // blocking queue> > Queue pbq> > => new> PriorityBlockingQueue();> > // Adding items to the pbq> > // using add()> > pbq.add(> 10> );> > pbq.add(> 20> );> > pbq.add(> 15> );> > // Printing the top element of> > // the PriorityBlockingQueue> > System.out.println(pbq.peek());> > // Printing the top element and> > // removing it from the> > // PriorityBlockingQueue> > System.out.println(pbq.poll());> > // Printing the top element again> > System.out.println(pbq.peek());> > }> }> |
出力
10 10 15
キューインターフェースのメソッド
キューインターフェイスは、キューインターフェイスに存在するすべてのメソッドを継承します。 コレクションインターフェイス 次のメソッドを実装しながら:
| 方法 | 説明 |
|---|---|
| add(int インデックス, 要素) | このメソッドは、キュー内の特定のインデックスに要素を追加するために使用されます。単一のパラメータが渡されると、その要素がキューの最後に追加されるだけです。 |
| addAll(int インデックス, Collection コレクション) | このメソッドは、指定されたコレクション内のすべての要素をキューに追加するために使用されます。単一のパラメーターが渡されると、指定されたコレクションのすべての要素がキューの最後に追加されます。 |
| サイズ() | このメソッドは、キューのサイズを返すために使用されます。 |
| クリア() | このメソッドは、キュー内のすべての要素を削除するために使用されます。ただし、作成されたキューの参照は引き続き保存されます。 |
| 取り除く() | このメソッドは、キューの先頭から要素を削除するために使用されます。 |
| 削除(int インデックス) | このメソッドは、指定されたインデックスから要素を削除します。後続の要素 (存在する場合) を左にシフトし、それらのインデックスを 1 ずつ減らします。 |
| 削除(要素) | このメソッドは、キュー内の指定された要素の最初の出現を削除して返すために使用されます。 |
| get(int インデックス) | このメソッドは、指定されたインデックスにある要素を返します。 |
| set(int インデックス, 要素) | このメソッドは、指定されたインデックスの要素を新しい要素に置き換えます。この関数は、新しい要素に置き換えられたばかりの要素を返します。 |
| IndexOf(要素) | このメソッドは、指定された要素の最初の出現を返します。または -1 要素がキューに存在しない場合。 |
| lastIndexOf(要素) | このメソッドは、指定された要素の最後の出現を返します。または -1 要素がキューに存在しない場合。 |
| 等しい(要素) | このメソッドは、指定された要素とキューの要素の同等性を比較するために使用されます。 |
| ハッシュコード() | このメソッドは、指定されたキューのハッシュコード値を返すために使用されます。 |
| isEmpty() | このメソッドは、キューが空かどうかを確認するために使用されます。キューが空の場合は true を返し、それ以外の場合は false を返します。 |
| 含む(要素) | このメソッドは、キューに指定された要素が含まれているかどうかを確認するために使用されます。キューに要素が含まれている場合は true を返します。 |
| containsAll(コレクションコレクション) | このメソッドは、キューに要素のすべてのコレクションが含まれているかどうかを確認するために使用されます。 |
| ソート(コンパレータ比較) | このメソッドは、指定された条件に基づいてキューの要素を並べ替えるために使用されます。 コンパレータ 。 |
| ブール値の追加(オブジェクト) | このメソッドは、指定された要素をキューに挿入し、成功時に true を返すために使用されます。 |
| ブール値のオファー(オブジェクト) | このメソッドは、指定された要素をキューに挿入するために使用されます。 |
| オブジェクトのポーリング() | このメソッドは、キューの先頭を取得して削除するために使用されます。キューが空の場合は null を返します。 |
| オブジェクト要素() | このメソッドはキューの先頭を取得するために使用されますが、削除されません。 |
| オブジェクトのピーク() | このメソッドは、このキューの先頭を取得するために使用されますが、削除はされません。このキューが空の場合は null を返します。 |
Java で Queue インターフェイスを使用する利点:
注文の保存 : Queue インターフェイスは、先入れ先出し (FIFO) 原則に従って、特定の順序で要素を保存および取得する方法を提供します。
柔軟性 : Queue インターフェイスは Collection インターフェイスのサブタイプであり、アプリケーションの要件に応じて、さまざまなデータ構造およびアルゴリズムで使用できることを意味します。
糸 – 安全性 注: java.util.concurrent.ConcurrentLinkedQueue クラスなどの Queue インターフェースの一部の実装はスレッドセーフです。つまり、競合を引き起こすことなく複数のスレッドから同時にアクセスできます。
パフォーマンス : Queue インターフェイスは、要素の追加、削除、検査のための効率的な実装を提供し、パフォーマンスが重要なアプリケーションで要素のコレクションを管理するための便利なツールとなります。
Java で Queue インターフェイスを使用する場合の欠点は次のとおりです。
制限された機能: Queue インターフェイスは、要素のコレクションを特定の順序で管理するために特別に設計されているため、より複雑なデータ構造やアルゴリズムには適していない可能性があります。
サイズ制限: ArrayDeque クラスなどの Queue インターフェイスの一部の実装はサイズが固定されており、特定の要素数を超えて拡張することはできません。
メモリ使用量: 実装によっては、Queue インターフェイスは、特に要素の順序に関する追加情報を保存する必要がある場合、他のデータ構造よりも多くのメモリを必要とする場合があります。
複雑 : Queue インターフェイスは、初心者プログラマーにとって、特にデータ構造とアルゴリズムの原則に精通していない場合、使用したり理解したりするのが難しい場合があります。