java queue queue methods
このチュートリアルでは、Javaのキューとは何か、その使用方法、Javaキューの例、Javaキューのメソッドとキューインターフェイスの実装について説明します。
キューは、線形データ構造またはJavaのコレクションであり、FIFO(先入れ先出し)の順序で要素を格納します。
キューコレクションには、フロントとリアの2つの端があります。要素は後部で追加され、前部から削除されます。
=> すべてのJavaトレーニングシリーズを見るには、ここにアクセスしてください。
学習内容:
Javaキューとは何ですか?
キューのデータ構造は次のように表されます。
上の図に示されているように、キューは2つのポイント、つまり開始(前)と終了(後)を持つ構造です。要素は後端のキューに挿入され、前部のキューから削除されます。
Javaでは、Queueはjava.utilパッケージの一部であるインターフェースです。キュー・インターフェースは、Javaコレクション・インターフェースを拡張します。
キューインターフェイスの一般的な定義は次のとおりです。
public interface Queue extends Collection
キューはインターフェースであるため、インスタンス化できません。 Queueインターフェースの機能を実装するには、いくつかの具体的なクラスが必要です。 LinkedListとPriorityQueueの2つのクラスがキューインターフェイスを実装します。
キューデータ構造の主な特徴のいくつかを次に示します。
- キューはFIFO(先入れ先出し)の順序に従います。これは、要素が最後にキューに挿入され、最初にキューから削除されることを意味します。
- Javaキューインターフェイスは、挿入、削除などのコレクションインターフェイスのすべてのメソッドを提供します。
- LinkedListとPriorityQueueは、キューインターフェイスを実装するクラスです。 ArrayBlockingQueueは、キューインターフェイスを実装するさらに別のクラスです。
- java.utilパッケージの一部であるキューは、制限のないキューとして分類できますが、java.util.theconcurrentパッケージに存在するキューは制限のあるキューです。
- Dequeは、両端からの挿入と削除をサポートするキューです。
- dequeはスレッドセーフです。
- BlockingQueuesはスレッドセーフであり、生産者/消費者問題を実装するために使用されます。
- BlockingQueuesはnull要素を許可しません。 null値に関連する操作が試行されると、NullPointerExceptionがスローされます。
Javaでキューを使用する方法は?
Javaでキューを使用するには、最初に次のようにキューインターフェイスをインポートする必要があります。
import java.util.queue;
または
import java.util.*;
これがインポートされると、以下に示すようにキューを作成できます。
Queue str_queue = new LinkedList ();
Queueはインターフェイスであるため、Queueインターフェイスを実装するLinkedListクラスを使用してキューオブジェクトを作成します。
同様に、他の具象クラスでキューを作成できます。
Queue str_pqueue = new PriorityQueue (); Queue int_queue = new ArrayDeque ();
キューオブジェクトが作成されたので、次に示すように、addメソッドを介してキューオブジェクトに値を指定することにより、キューオブジェクトを初期化できます。
str_queue.add(“one”); str_queue.add(“two”); str_queue.add(“three”);
Javaキューの例
import java.util.*; public class Main { public static void main(String[] args) { //declare a Queue Queue str_queue = new LinkedList(); //initialize the queue with values str_queue.add('one'); str_queue.add('two'); str_queue.add('three'); str_queue.add('four'); //print the Queue System.out.println('The Queue contents:' + str_queue); } }
出力:
キューの内容:[1、2、3、4]
広告なしのアンドロイドのための最高のmp3ダウンローダー
上記の例は、Queueオブジェクトの宣言と初期化を示しています。次に、キューの内容を出力するだけです。
Javaのキューメソッド
このセクションでは、キューのAPIのメソッドについて説明します。キューインターフェイスは、挿入、削除、ピークなどのさまざまな操作をサポートします。一部の操作は例外を発生させ、一部の操作はメソッドが成功または失敗したときに特定の値を返します。
Java 8のQueueコレクションに特定の変更はないことに注意してください。以下のメソッドは、Java9などの新しいバージョンのJavaでも使用できます。
次の表は、これらすべての方法をまとめたものです。
方法 | メソッドプロトタイプ | 説明 |
---|---|---|
サイズ | int size() | キュー内の要素のサイズまたは数を返します。 |
追加 | boolean add(E e) | 容量の制限に違反することなく、キューの最後(テール)のキューに要素eを追加します。成功した場合はtrueを返し、容量が使い果たされた場合はIllegalStateExceptionを返します。 |
ピーク | Eピーク() | キューの先頭(先頭)を削除せずに返します。 |
素子 | E要素() | peek()メソッドと同じ操作を実行します。キューが空の場合、NoSuchElementExceptionをスローします。 |
削除する | E remove() | キューの先頭を削除して返します。キューが空の場合、NoSuchElementExceptionをスローします。 |
投票 | E投票() | キューの先頭を削除して返します。キューが空の場合、nullを返します。 |
提供 | ブールオファー(E e) | 容量制限に違反せずに、新しい要素eをキューに挿入します。 |
キュー要素の反復
forEachループを使用するか、イテレーターを使用して、キュー要素をトラバースできます。以下に示すプログラムは、キューをトラバースするための両方のアプローチを実装しています。
import java.util.*; public class Main { public static void main(String[] args) { //declare a Queue Queue LL_queue = new LinkedList(); //initialize the Queue LL_queue.add('Value-0'); LL_queue.add('Value-1'); LL_queue.add('Value-2'); LL_queue.add('Value-3'); //traverse the Queue using Iterator System.out.println('The Queue elements through iterator:'); Iterator iterator = LL_queue.iterator(); while(iterator.hasNext()){ String element = (String) iterator.next(); System.out.print(element + ' '); } System.out.println('
The Queue elements using for loop:'); //use new for loop to traverse the Queue for(Object object : LL_queue) { String element = (String) object; System.out.print(element + ' '); } } }
出力:
イテレータを介したキュー要素:
値-0値-1値-2値-3
forループを使用するキュー要素:
値-0値-1値-2値-3
Javaキューの実装
以下のプログラムは、上記で説明した方法を示しています。
import java.util.*; public class Main { public static void main(String[] args) { Queue q1 = new LinkedList(); //Add elements to the Queue q1.add(10); q1.add(20); q1.add(30); q1.add(40); q1.add(50); System.out.println('Elements in Queue:'+q1); //remove () method =>removes first element from the queue System.out.println('Element removed from the queue: '+q1.remove()); //element() => returns head of the queue System.out.println('Head of the queue: '+q1.element()); //poll () => removes and returns the head System.out.println('Poll():Returned Head of the queue: '+q1.poll()); //returns head of the queue System.out.println('peek():Head of the queue: '+q1.peek()); //print the contents of the Queue System.out.println('Final Queue:'+q1); } }
出力:
キュー内の要素:[10、20、30、40、50]
キューから削除された要素:10
キューの先頭:20
Poll():キューの先頭に戻る:20
peek():キューの先頭:30
最終キュー:[30、40、50]
Javaキュー配列の実装
キューの実装は、スタックの実装ほど単純ではありません。まず、キューには、リアとフロントの2つのポインタが含まれています。また、2つの異なる端で異なる操作が実行されます。
配列を使用してキューを実装するには、最初にn個のキュー要素を保持する配列を宣言します。
次に、このキューで実行される次の操作を定義します。
#1)エンキュー: キューに要素を挿入する操作は、エンキュー(プログラムの関数queueEnqueue)です。後端に要素を挿入するには、最初にキューがいっぱいかどうかを確認する必要があります。いっぱいの場合、要素を挿入できません。リアの場合 #2)デキュー: キューから要素を削除する操作は、Dequeue(プログラムの関数queueDequeue)です。まず、キューが空かどうかを確認します。デキュー操作が機能するには、キューに少なくとも1つの要素が存在する必要があります。 #3)フロント: このメソッドは、キューの先頭を返します。 #4)ディスプレイ: このメソッドはキューをトラバースし、キューの要素を表示します。 次のJavaプログラムは、Queueの配列実装を示しています。 出力: 初期キュー: 上記のプログラムで配列を使用してキューデータ構造を実装したので、リンクリストを使用してキューを実装することもできます。 このプログラムでは、enqueue、dequeue、front、displayと同じメソッドを実装します。違いは、配列の代わりにリンクリストデータ構造を使用することです。 以下のプログラムは、JavaでのQueueのリンクリストの実装を示しています。 出力: 要素6がキューに追加されました BlockingQueueは、Java 1.5で追加されたインターフェースであり、 java.util.concurrent パッケージ。このインターフェースは、BlockingQueueがいっぱいまたは空の場合にブロッキングを導入します。 したがって、スレッドがキューにアクセスし、すでにいっぱいになっているキューに要素を挿入(エンキュー)しようとすると、別のスレッドがキューにスペースを作成するまで(おそらくデキュー操作またはキューのクリアによって)ブロックされます。 同様に、デキューの場合、要素がデキュー操作で使用可能になるまで、キューが空の場合、操作はブロックされます。 BlockingQueueメソッドは、内部ロックなどの何らかの形式の同時実行制御を使用し、アトミックです。 BlockingQueueは、キュー操作を同時に管理する並行キューです。 BlockingQueueを以下に示します。 BlockingQueueはnull値を受け入れないことに注意してください。キューにnull値を挿入しようとすると、NullPointerExceptionが発生します。 Javaで提供されるBlockingQueue実装には、LinkedBlockingQueue、PriorityBlockingQueue、ArrayBlockingQueue、およびSynchonousQueueがあります。これらの実装はすべてスレッドセーフです。 BlockingQueuesには次の2つのタイプがあります。 制限付きキューでは、キューの容量がキューのコンストラクターに渡されます。 キュー宣言は次のとおりです。 BlockingQueueblockingQueue =新しいLinkedBlockingDeque(5); 無制限のキューでは、キューの容量を明示的に設定せず、サイズが大きくなる可能性があります。容量はInteger.MAX_VALUEに設定されます。 無制限キューの宣言は次のとおりです。 BlockingQueueblockingQueue =新しいLinkedBlockingDeque(); BlockingQueueインターフェースは、主に、プロデューサーがリソースを生成し、コンシューマーがリソースを消費する、プロデューサーとコンシューマーのタイプの問題に使用されます。 Q#1)Javaのキューとは何ですか? 回答: Javaのキューは、要素のFIFO(先入れ先出し)順序に従う線形順序のデータ構造です。これは、キューに最初に挿入された要素が、削除される最初の要素になることを意味します。 Javaでは、キューはコレクションインターフェイスを継承するインターフェイスとして実装されます。 Q#2) キューはスレッドセーフなJavaですか? 回答: すべてのキューがスレッドセーフであるわけではありませんが、JavaのBlockingQueuesはスレッドセーフです。 Q#3) スタックとキューのどちらが速いですか? 回答: スタックは高速です。スタックでは、要素は一方の端からのみ処理されるため、シフトは必要ありません。ただし、キューでは、要素を挿入および削除するための2つの異なるポインターがあるため、要素をシフトおよび調整する必要があります。 Q#4) キューの種類は何ですか? 回答:キューには次のタイプがあります。 Q#5) なぜキューが使用されるのですか? 回答: キューのデータ構造は、同期の目的で使用されます。キューは、ディスクとCPUのスケジューリングにも使用されます。 このチュートリアルでは、宣言、初期化の実装、メソッドなどの詳細とともに、単純なキューについて説明しました。また、JavaでのQueueのArrayおよびLinkedListの実装についても学びました。 今後のチュートリアルでは、より多くの種類のキューについて詳しく説明します。 => ここですべてのJavaチュートリアルを確認してください。 class Queue { private static int front, rear, capacity; private static int queue[]; Queue(int size) { front = rear = 0; capacity = size; queue = new int[capacity]; } // insert an element into the queue static void queueEnqueue(int item) { // check if the queue is full if (capacity == rear) { System.out.printf('
Queue is full
'); return; } // insert element at the rear else { queue[rear] = item; rear++; } return; } //remove an element from the queue static void queueDequeue() { // check if queue is empty if (front == rear) { System.out.printf('
Queue is empty
'); return; } // shift elements to the right by one place uptil rear else { for (int i = 0; i
.binファイルウィンドウを開く10
キューが空です
エンキュー操作後のキュー:
10 = 30 = 50 = 70 =
キューのフロント要素:10
キューがいっぱいです
10 = 30 = 50 = 70 =
2回のデキュー操作後にキューに入れます:50 = 70 =
キューのフロント要素:50Javaキューリンクリストの実装
class LinkedListQueue { private Node front, rear; private int queueSize; // queue size //linked list node private class Node { int data; Node next; } //default constructor - initially front & rear are null; size=0; queue is empty public LinkedListQueue() { front = null; rear = null; queueSize = 0; } //check if the queue is empty public boolean isEmpty() { return (queueSize == 0); } //Remove item from the front of the queue. public int dequeue() { int data = front.data; front = front.next; if (isEmpty()) { rear = null; } queueSize--; System.out.println('Element ' + data+ ' removed from the queue'); return data; } //Add data at the rear of the queue. public void enqueue(int data) { Node oldRear = rear; rear = new Node(); rear.data = data; rear.next = null; if (isEmpty()) { front = rear; } else { oldRear.next = rear; } queueSize++; System.out.println('Element ' + data+ ' added to the queue'); } //print front and rear of the queue public void print_frontRear() { System.out.println('Front of the queue:' + front.data + ' Rear of the queue:' + rear.data); } } class Main{ public static void main(String a[]){ LinkedListQueue queue = new LinkedListQueue(); queue.enqueue(6); queue.enqueue(3); queue.print_frontRear(); queue.enqueue(12); queue.enqueue(24); queue.dequeue(); queue.dequeue(); queue.enqueue(9); queue.print_frontRear(); } }
要素3がキューに追加されました
キューの前:6キューの後:3
要素12がキューに追加されました
要素24がキューに追加されました
要素6がキューから削除されました
要素3がキューから削除されました
要素9がキューに追加されました
キューの前:12キューの後:9JavaのBlockingQueue
BlockingQueueタイプ
制限付きキュー
無制限のキュー
よくある質問
最高の無料DVDリッパーウィンドウズ10
結論
推奨読書