Java Queue(ジャヴァキュー)は、Javaにおけるキュー(待ち行列)です。
ジャバキュー
このセクションでは、Javaのキューについていくつかの重要なポイントを説明します。
- java.util.Queue interface is a subtype of java.util.Collection interface.
- Just like a real-world queue (for instance, in a bank or at ATM), Queue inserts elements at the end of the queue and removes from the beginning of the queue.
- Java Queue represents an ordered list of elements.
- Java Queue follows FIFO order to insert and remove it’s elements. FIFO stands for First In First Out.
- Java Queue supports all methods of Collection interface.
- Most frequently used Queue implementations are LinkedList, ArrayBlockingQueue and PriorityQueue.
- BlockingQueues do not accept null elements. If we perform any null related operation, it throws NullPointerException.
- BlockingQueues are used to implement Producer/Consumer based applications.
- BlockingQueues are thread-safe.
- All Queues which are available in java.util package are Unbounded Queues and Queues which are available in java.util.concurrent package are Bounded Queues.
- All Deques are not thread-safe.
- ConcurrentLinkedQueue is an unbounded thread-safe Queue based on linked nodes.
- All Queues supports insertion at the tail of the queue and removal at the head of the queue, except Deques.
- Deques are queues but they support element insertion and removal at both ends.
JavaのQueueクラスのダイアグラムを説明してください。
Javaのキューメソッド
このセクションでは、便利で頻繁に使用されるJavaのQueueメソッドのいくつかについて説明します。
- Setの要素の数を取得するためのint size()メソッド、Setが空かどうかを確認するためのboolean isEmpty()メソッド、指定された要素がこのSetに含まれている場合にtrueを返すboolean contains(Object o)メソッド、このSetの要素に対するイテレーターを返すIterator iterator()メソッド(要素の順序は特定されていません)、指定されたコレクションに含まれる要素をこのSetからすべて削除するboolean removeAll(Collection c)メソッド(オプションの操作)、指定されたコレクションに含まれる要素のみをこのSetに保持するboolean retainAll(Collection c)メソッド(オプションの操作)、Setからすべての要素を削除するためのvoid clear()メソッド、キューの先頭を取得して削除するためのE remove()メソッド、キューの先頭を取得して削除し、キューが空の場合はnullを返すE poll()メソッド、キューの先頭を取得するが削除はせず、キューが空の場合はnullを返すE peek()メソッド、指定された要素をキューに挿入できる場合には容量制限を守りながらすぐに挿入し、成功した場合はtrueを返し、現在利用可能なスペースがない場合はIllegalStateExceptionをスローするboolean offer(E e)メソッド、キューの先頭を取得するが削除はせず、キューが空の場合はnullを返すE element()メソッド、指定された要素をキューに挿入できる場合には容量制限を守りながらすぐに挿入し、成功した場合はtrueを返し、現在利用可能なスペースがない場合はIllegalStateExceptionをスローするboolean add(E e)メソッド、このSetのすべての要素を含む配列を返すObject[] toArray()メソッド(要素の順序はイテレーターによって保証されている場合、このメソッドは同じ順序で要素を返さなければならない)。
Javaのキューの基本
JavaのQueueはJavaのCollectionを拡張するため、すべてのCollectionインターフェースの操作もサポートしています。以下の例でいくつかの簡単な操作を探ってみましょう。
package com.scdev.queue;
import java.util.*;
public class QueueExample {
public static void main(String[] args) {
Queue<String> 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"));
// To empty the queue
queue.clear();
}
}
出力:
[one, two, three, four]
[one, two, four]
Queue Size: 3
Queue Contains element 'two' or not? : true
Javaの配列をキューに変換する。
ここでは、「Collections.addAll()」メソッドを使用してJavaの配列をQueueに変換する方法と、簡単な例を紹介します。
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をJava Arrayに変換する方法について「toArray()」を使った簡単な例を探ります。
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 キューの一般的な操作
Javaのキューは、コレクションのインターフェースでサポートされているすべての操作およびいくつかの追加の操作をサポートしています。2つの形式でほぼすべての操作をサポートしています。
- One set of operations throws an exception if the operation fails.
- The other set of operations returns a special value if the operation fails.
以下の表は、すべてのキューの一般的な操作を簡潔に説明しています。
Operation | Throws exception | Special value |
---|---|---|
Insert | add(e) | offer(e) |
Remove | remove() | poll() |
Examine | element() | peek() |
今後のセクションでは、それぞれの手順を詳細に説明し、役立つ例を交えて議論します。
Javaのキューにおける要素の追加操作
このセクションでは、Javaのキューの挿入操作について詳しく説明します。いくつかの有用な例を用いて説明します。この操作が成功すると、”true”という値が返されます。キューは2つの形式で挿入操作をサポートしていることがわかっています。
- Queue.add(e):
It throws an exception if the operation fails.- Queue.offer(e):
It returns a special value if the operation fails.
ここでは「特別な値」は「false」または「null」ということがあります。
キューの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);
}
}
上記のプログラムを実行すると、以下の出力が得られます。
true
true
[one, two]
Exception in thread "main" java.lang.IllegalStateException: Queue full
私たちのキューは2つの要素に限定されているため、BlockingQueue.add()を使用して3つ目の要素を追加しようとすると、上記のように例外が発生します。
キューのoffer()操作
offer()操作は、新しい要素をキューに挿入するために使用されます。挿入操作が成功した場合、それは「true」の値を返します。それ以外の場合は「false」の値を返します。この機能を示すために、1つの簡単な例を開発しましょう。
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);
}
}
上記のプログラムを実行すると、以下の結果が得られます。
true
true
[one, two]
false
[one, two]
私たちのキューは2つの要素に制限されているため、BlockingQueue.offer() 操作を使用して3番目の要素を追加しようとすると、上記のように「false」の値が返されます。
Javaのキューの削除操作
このセクションでは、いくつかの有用な例を交えて、Javaのキューの削除操作について詳しく説明します。削除操作は、成功した場合にキューの先頭要素を返します。キューは2つの形式で削除操作をサポートしていることがわかっています。
- Queue.remove():
It throws an exception if the operation fails.- Queue.poll():
It returns a special value if the operation fails.
注:ここでの特別な値は、「false」または「null」のいずれかです。
キューからの要素の削除操作
remove()操作は、キューの先頭から要素を削除するために使用されます。削除操作が成功した場合、キューの先頭の要素を返します。それ以外の場合は、java.util.NoSuchElementExceptionをスローします。この機能を示すために、簡単な例を作成しましょう。
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(要素)は、キューから指定された要素を削除するために使用されます。削除操作が成功した場合は「true」値を返します。それ以外の場合は「false」値を返します。
キューのpoll()操作
poll()演算子は、キューの先頭から要素を削除するために使用されます。削除操作が成功した場合は、キューの先頭の要素を返します。それ以外の場合、”null”の値を返します。この機能を示すために、簡単な例を開発しましょう。
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のQueueの調査オペレーションについて細かく説明し、いくつかの便利な例を示します。このオペレーションが成功すると、キューの先頭要素が削除されずに返されます。Queueは、調査オペレーションを2つの形式でサポートしていることがわかっています。
- Queue.element():
It throws an exception if the operation fails.- Queue.peek():
It returns a special value if the operation fails.
注意:ここでの特別な値は「false」または「null」のいずれかです。
キューの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
もし空のQueueにelement()メソッドを呼び出そうとすると、上記のように例外が発生します。
キューの先頭要素を取得する操作。
peek(ピーク)操作は、キューの先頭から要素を取り出すために使用されます。要素を削除せずにキューから取得します。この操作が成功すると、キューの先頭の要素を返します。そうでない場合は、null値を返します。この機能を示すために、簡単な例を開発しましょう。
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つのタイプに分類することができます。
- Bounded Queues
- Unbounded Queues
容量によって制限されるキューは、作成時にキューの最大サイズを指定する必要があるキューです。 たとえばArrayBlockingQueue(前の例を参照)。 容量によって制限されないキューは、キューのサイズを指定する必要がないキューです。 たとえばLinkedList(前の例を参照)。 java.utilパッケージにあるすべてのキューは制限されないキューであり、java.util.concurrentパッケージにあるキューは制限されたキューです。 他の方法では、これらは次の2つのタイプに大別することができます:
- Blocking Queues
- Non-Blocking Queues
BlockingQueueインタフェースを実装しているすべてのキューはBlockingQueueであり、その他はNon-Blocking Queueです。BlockingQueueは、ジョブが完了するかタイムアウトするまでブロックし、一方、Non-Blocking Queueはそうしません。一部のキューはDequeであり、一部のキューはPriorityQueueです。
ブロッキングキューの操作
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のQueueに関する簡単なまとめです。これらのJava Queueの例が、Queueコレクションのプログラミングを始めるのに役立つことを願っています。もし私のチュートリアルが気に入ったり、提案や問題、タイプミスがあれば、コメントを残してください。ありがとうございます。