Java Queueは、java.utilパッケージで利用可能なインタフェースであり、java.util.Collectionインタフェースを拡張しています。Java Listと同様に、Java Queueは順序付けられた要素(またはオブジェクト)のコレクションですが、挿入と削除の操作が異なります。要素を処理する前に、Queueを使用して要素を保存することができます。
Java Queue
このセクションでは、Java Queueに関するいくつかの重要なポイントについて説明します:
- java.util.Queueインタフェースは、java.util.Collectionインタフェースのサブタイプです。
- 実際の世界のキュー(たとえば、銀行やATMなど)のように、Queueは要素をキューの末尾に挿入し、キューの先頭から削除します。
- Java Queueは、要素の順序付きリストを表します。
- Java Queueは、要素を挿入および削除するためにFIFO(先入れ先出し)の順序を使用します。
- Java Queueは、Collectionインタフェースのすべてのメソッドをサポートしています。
- 最も頻繁に使用されるQueueの実装はLinkedList、ArrayBlockingQueue、およびPriorityQueueです。
- BlockingQueueは、nullの要素を受け入れません。nullに関連する操作を実行すると、NullPointerExceptionがスローされます。
- BlockingQueueは、プロデューサー/コンシューマーベースのアプリケーションを実装するために使用されます。
- BlockingQueueはスレッドセーフです。
- すべてのキューは、java.utilパッケージで利用可能であり、Unbounded Queuesであり、java.util.concurrentパッケージで利用可能なキューはBounded Queuesです。
- すべてのDequesはスレッドセーフではありません。
- ConcurrentLinkedQueueは、リンクされたノードに基づいたバウンドのないスレッドセーフなキューです。
- すべてのキューは、キューの末尾への挿入とキューの先頭からの削除をサポートしていますが、Dequesは除きます。
- Dequesはキューですが、両端で要素の挿入と削除をサポートしています。
Java Queueクラス図
Java QueueインターフェースはCollectionインターフェースを拡張しています。CollectionインターフェースはIterableインターフェースを拡張しています。よく使用されるQueueの実装クラスには、LinkedList、PriorityQueue、ArrayBlockingQueue、DelayQueue、LinkedBlockingQueue、PriorityBlockingQueueなどがあります。AbstractQueueは、Queueの実装の労力を軽減するためにQueueインターフェースのスケルトン実装を提供します。
Java Queueメソッド
このセクションでは、いくつかの便利で頻繁に使用されるJava Queueメソッドについて説明します:
- int size(): セット内の要素数を取得します。
- boolean isEmpty(): Setが空かどうかをチェックします。
- boolean contains(Object o): このSetに指定された要素が含まれている場合はtrueを返します。
- Iterator iterator(): このセット内の要素に対する反復子を返します。要素は特定の順序で返されます。
- boolean removeAll(Collection c): 指定されたコレクションに含まれるこのセットのすべての要素を削除します(オプションの操作)。
- boolean retainAll(Collection c): 指定されたコレクションに含まれるこのセット内の要素のみを保持します(オプションの操作)。
- void clear(): セットからすべての要素を削除します。
- E remove(): Retrieves and removes the head of this queue.
- E poll(): Retrieves and removes the head of this queue, or returns null if this queue is empty.
- E peek(): Retrieves, but does not remove, the head of this queue, or returns null if this queue is empty.
- boolean offer(E e): 容量制限を違反せずに即座に指定された要素をこのキューに挿入できる場合はtrueを返します。
- E element(): Retrieves, but does not remove, the head of this queue.
- boolean add(E e): 現在利用可能なスペースがない場合は、指定された要素をこのキューに即座に挿入しようとしてIllegalStateExceptionをスローし、成功した場合はtrueを返します。
- Object[] toArray(): このセットのすべての要素を含む配列を返します。このセットがその反復子によって要素が返される順序に関する保証を行う場合、このメソッドは同じ順序で要素を返さなければなりません。
Java Queue Basics
Java QueueはJava Collectionを拡張しているため、すべてのCollectionインターフェース操作もサポートしています。次の例でいくつかの単純な操作を探ってみましょう:
package com.journaldev.queue;
import java.util.*;
public class QueueExample {
public static void main(String[] args) {
Queue queue = new LinkedList<>();
queue.add("one");
queue.add("two");
queue.add("three");
queue.add("four");
System.out.println(queue);
queue.remove("three");
System.out.println(queue);
System.out.println("Queue Size: " + queue.size());
System.out.println("Queue Contains element 'two' or not? : " + queue.contains("two"));
// キューを空にする
queue.clear();
}
}
出力:
[one, two, three, four]
[one, two, four]
Queue Size: 3
Queue Contains element 'two' or not? : true
Java Array to Queue
ここでは、「Collections.addAll()」メソッドを使用してJava配列をQueueに変換する方法を1つのシンプルな例で探ることができます。
import java.util.*;
public class ArrayToQueue {
public static void main(String[] args) {
String nums[] = {"one","two","three","four","five"};
Queue<String> queue = new LinkedList<>();
Collections.addAll(queue, nums);
System.out.println(queue);
}
}
出力: 上記のプログラムを実行すると、以下の出力が得られます:
[one, two, three, four, five]
Java Queue to Array
ここでは、「toArray()」を使用してJava QueueをJava配列に変換する方法を1つのシンプルな例で探ります。
import java.util.*;
public class QueueToArray {
public static void main(String[] args) {
Queue<String> queue = new LinkedList<>();
queue.add("one");
queue.add("two");
queue.add("three");
queue.add("four");
queue.add("five");
String strArray[] = queue.toArray(new String[queue.size()]);
System.out.println(Arrays.toString(strArray));
}
}
出力: 上記のプログラムを実行すると、以下の出力が得られます:
[one, two, three, four, five]
Java Queueの一般的な操作
Java QueueはCollectionインターフェースでサポートされているすべての操作とさらにいくつかの操作をサポートしています。ほとんどの操作を2つの形式でサポートしています。
- 一連の操作のセットは、操作が失敗した場合に例外をスローします。
- もう1つの操作のセットは、操作が失敗した場合に特別な値を返します。
次の表は、すべてのキューの一般的な操作を簡潔に説明しています。
Operation | Throws exception | Special value |
---|---|---|
Insert | add(e) | offer(e) |
Remove | remove() | poll() |
Examine | element() | peek() |
次のセクションでは、各操作をピックアップして、いくつかの有用な例を使って詳しく説明します。
Javaキュー挿入操作
このセクションでは、Javaキュー挿入操作について詳しく説明します。この操作が成功した場合、”true”の値が返されます。キューは、次の2つの形式で挿入操作をサポートしています:
- Queue.add(e):
操作が失敗した場合は例外をスローします。- Queue.offer(e):
操作が失敗した場合は特別な値を返します。
注:ここでの特別な値は、”false”または”null”のいずれかです。
Queue add()操作
add()操作は新しい要素をキューに挿入するために使用されます。挿入操作が成功した場合、”true”の値が返されます。それ以外の場合は、java.lang.IllegalStateExceptionがスローされます。この機能をデモンストレーションするためのシンプルな例を開発しましょう。
import java.util.concurrent.*;
public class QueueAddOperation {
public static void main(String[] args) {
BlockingQueue<String> queue = new ArrayBlockingQueue<>(2);
System.out.println(queue.add("one"));
System.out.println(queue.add("two"));
System.out.println(queue);
System.out.println(queue.add("three"));
System.out.println(queue);
}
}
Output:- 上記のプログラムを実行すると、以下の出力が得られます:
true
true
[one, two]
Exception in thread "main" java.lang.IllegalStateException: Queue full
キューが2つの要素に制限されているため、BlockingQueue.add()を使用して3番目の要素を追加しようとすると、上記のように例外がスローされます。
キュー offer() 操作
offer() 操作は新しい要素をキューに挿入するために使用されます。挿入操作が成功した場合、「true」値が返されます。それ以外の場合は「false」値が返されます。この機能をデモンストレーションするために、以下に簡単な例を開発しましょう。
import java.util.concurrent.*;
public class QueueOfferOperation {
public static void main(String[] args) {
BlockingQueue<String> queue = new ArrayBlockingQueue<>(2);
System.out.println(queue.offer("one"));
System.out.println(queue.offer("two"));
System.out.println(queue);
System.out.println(queue.offer("three"));
System.out.println(queue);
}
}
Output:- 上記のプログラムを実行すると、以下の出力が得られます:
true
true
[one, two]
false
[one, two]
キューが2つの要素に制限されているため、BlockingQueue.offer() 操作を使用して3番目の要素を追加しようとすると、上記のように「false」値が返されます。
Java キューの削除操作
このセクションでは、Java キューの削除操作について詳しく説明し、いくつかの有用な例を示します。削除操作はキューの先頭要素を返します。キューは2つの形式で削除操作をサポートしています:
- Queue.remove():
操作が失敗した場合、例外がスローされます。- Queue.poll():
操作が失敗した場合、特別な値が返されます。
注意:ここでの特別な値は、”false”または”null”のいずれかです。
キューのremove()操作
remove()操作は、キューの先頭から要素を削除するために使用されます。削除操作が成功した場合、キューの先頭の要素を返します。それ以外の場合は、java.util.NoSuchElementExceptionをスローします。この機能を示すために、1つのシンプルな例を開発しましょう。
import java.util.*;
public class QueueRemoveOperation
{
public static void main(String[] args)
{
Queue<String> queue = new LinkedList<>();
queue.offer("one");
queue.offer("two");
System.out.println(queue);
System.out.println(queue.remove());
System.out.println(queue.remove());
System.out.println(queue.remove());
}
}
出力:上記のプログラムを実行すると、次の出力が得られます。
[one, two]
one
two
Exception in thread "main" java.util.NoSuchElementException
キューには要素が2つしかないため、3回目にremove()メソッドを呼び出そうとすると、上記のように例外が発生します。注意:Queue.remove(element)は、キューから指定された要素を削除するために使用されます。削除操作が成功した場合、”true”値が返されます。それ以外の場合は、”false”値が返されます。
キューのpoll()操作
poll()操作は、キューの先頭から要素を削除するために使用されます。削除操作が成功した場合、キューの先頭の要素を返します。それ以外の場合は、”null”値が返されます。この機能を示すために、1つのシンプルな例を開発しましょう。
import java.util.*;
public class QueuePollOperation
{
public static void main(String[] args)
{
Queue<String> queue = new LinkedList<>();
queue.offer("one");
queue.offer("two");
System.out.println(queue);
System.out.println(queue.poll());
System.out.println(queue.poll());
System.out.println(queue.poll());
}
}
出力:上記のプログラムを実行すると、次の出力が得られます:
[one, two]
one
two
null
キューに要素が2つしかないため、3回目にpoll()メソッドを呼び出すと、上記のようにnull値が返されます。
Javaキューの検査操作
このセクションでは、いくつかの有用な例を使用して、Javaキューの検査操作について詳しく説明します。この操作が成功した場合、キューの先頭要素が削除されずに返されます。キューは次の2つの形式で検査操作をサポートしていることを知っています:
- Queue.element():
操作が失敗した場合、例外がスローされます。- Queue.peek():
操作が失敗した場合、特別な値が返されます。
注意: ここでの特別な値は、「false」または「null」のいずれかです。
Queue.element()操作
element()操作は、キューの先頭から要素を取得して、それを削除せずに返します。検査操作が成功した場合、キューの先頭要素が返されます。それ以外の場合は、java.util.NoSuchElementExceptionがスローされます。この機能をデモンストレーションするための簡単な例を開発しましょう。
import java.util.*;
public class QueueElementOperation {
public static void main(String[] args) {
Queue<String> queue = new LinkedList<>();
queue.add("one");
System.out.println(queue.element());
System.out.println(queue);
queue.clear();
System.out.println(queue.element());
}
}
出力:上記のプログラムを実行すると、次の出力が得られます:
one
[one]
Exception in thread "main" java.util.NoSuchElementException
空のキューにelement()メソッドを呼び出そうとすると、上記のように例外が発生します。
Queueのpeek()操作
peek()操作は、キューの先頭から要素を取得するために使用されますが、取り除きません。操作が成功した場合、キューの先頭要素を返します。それ以外の場合はnull値を返します。この機能を示すために、1つの簡単な例を開発しましょう。
import java.util.*;
public class QueuePeekOperation {
public static void main(String[] args) {
Queue<String> queue = new LinkedList<>();
queue.add("one");
System.out.println(queue.peek());
System.out.println(queue);
queue.clear();
System.out.println(queue.peek());
}
}
出力:-上記のプログラムを実行すると、以下の出力が得られます。
one
[one]
null
空のキューにpeek()メソッドを呼び出すと、null値が返されますが、上記のように例外は発生しません。
Javaのキューカテゴリ
Javaでは、多くのキューの実装を見つけることができます。以下の2つのタイプに大きく分類することができます。
- バウンドキュー
- アンバウンドキュー
バウンドされたキューは、容量によって制限されたキューです。これは、作成時にキューの最大サイズを指定する必要があることを意味します。たとえば、ArrayBlockingQueue(前の例を参照)です。バウンドされていないキューは、容量で制限されていないキューです。つまり、キューのサイズを指定する必要はありません。たとえば、LinkedList(前の例を参照)です。java.utilパッケージで利用可能なすべてのキューは、バウンドされていないキューであり、java.util.concurrentパッケージで利用可能なキューはバウンドされたキューです。他の方法では、次の2つのタイプに大別することができます:
- ブロッキングキュー
- 非ブロッキングキュー
BlockingQueueインタフェースを実装するすべてのキューはBlockingQueuesであり、残りはNon-Blocking Queuesです。BlockingQueuesは、ジョブが完了するかタイムアウトするまでブロックされますが、Non-BlockingQueuesはそうではありません。一部のキューはDequesであり、一部はPriorityQueuesです。
BlockingQueue操作
Queueの2つの操作形式に加えて、BlockingQueueは以下に示すように2つの追加の形式をサポートしています。
Operation | Throws exception | Special value | Blocks | Times out |
---|---|---|---|---|
Insert | add(e) | offer(e) | put(e) | offer(e, time, unit) |
Remove | remove() | poll() | take() | poll(time, unit) |
Examine | element() | peek() | N/A | N/A |
一部の操作は、ジョブが完了するまでブロックされ、他の操作はタイムアウトするまでブロックされます。これでJavaのキューに関する簡単な概要が終わりました。これらのJavaキューの例が、キューのコレクションプログラミングを始めるのに役立つことを願っています。私のチュートリアルが気に入ったり、提案や問題やタイプエラーがある場合は、コメントを残してください。ありがとうございました。
Source:
https://www.digitalocean.com/community/tutorials/java-queue