Java Goldのお勉強をしていたら出てきたので走り書き。
Queue<E>
Collection<E>を継承する。すなわち配列とかみたいに複数のデータをまとめて使うための物。
では他のコレクションと何が違うのか、Queueという単語を某英語翻訳サイトで調べてみると、
(順番を待つ人や乗り物の)列
とのこと。()内がわりとミソ。
すなわち「FIFO(First-in-First-out)」という最初に入れたものを最初に取り出すことのできるデータ構造になっています。
順番待ってる人も先に並んでる人が先に順番回ってきますしね。
そんなわけで「待ち行列」と呼ばれていたりもします。
ただし別にFIFOの実装でなければならない、ということではないそうです。
メソッド
エラー時に例外を投げる | エラー時にnullを返す | |
---|---|---|
挿入 | add(e) | offer(e) |
取出し | remove() | poll() |
参照 | element() | peak() |
import java.util.Queue;
import java.util.ArrayDeque;
public class QueueTest {
public void myQueue() {
Queue<Integer> queueTest = new ArrayDeque<Integer>();
for(int i=0; i < 10; i++) {
// キューに値を挿入
queueTest.add(i);
}
// キューに値を挿入
queueTest.offer(100);
System.out.println(queueTest);
// 先頭を取り出す
Integer r = queueTest.remove();
System.out.println("remove value: " + r);
// 先頭を参照
System.out.println(queueTest.element());
// 先頭を取りだす
Integer p = queueTest.poll();
System.out.println("poll value: " + p);
// 先頭を参照
System.out.println(queueTest.peek());
System.out.println(queueTest);
}
}
実行結果:
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 100]
remove value: 0
1
poll value: 1
2
[2, 3, 4, 5, 6, 7, 8, 9, 100]
Deque<E>
Queue<E>を継承する。正式名称は「Double Ended Queue(両端キュー)」
その名の通り要素を両端から挿入・削除できるキューです。
ちなみにDequeは「デック」と読むらしいです。
「『デキュー』じゃないのか…」と思ったのですが、「データを取り出す操作」を意味する「dequeue(デキュー)」と
ごっちゃになってました。同じ過ちを犯した人は絶対いるはず。
メソッド
エラー時に例外を投げる | エラー時にnullを返す | |
---|---|---|
挿入(先頭) | addFirst(e) | offerFirst(e) |
挿入(末尾) | removeFirst() | pollFirst() |
取出し(先頭) | getFirst() | peakFirst() |
取出し(末尾) | addLast() | offerLast() |
参照(先頭) | removeLast() | pollLast() |
参照(末尾) | getLast() | peakLast() |
なんで例外スローの方の参照elementFirst/Lastじゃないんや… |
import java.util.Deque;
import java.util.ArrayDeque;
public class DequeTest {
public void myDeque() {
Deque<Integer> dequeTest = new ArrayDeque<Integer>();
for(int i=0; i < 10; i++) {
// キューに値を先頭から挿入
dequeTest.addFirst(i);
}
System.out.println(dequeTest);
// 末尾を取り出す
Integer r = dequeTest.removeLast();
System.out.println("remove value: " + r);
// 末尾を参照
System.out.println(dequeTest.getLast());
// 先頭を取りだす
Integer p = dequeTest.pollFirst();
System.out.println("poll value: " + p);
// 先頭を参照
System.out.println(dequeTest.peekFirst());
System.out.println(dequeTest);
}
}
実行結果:
[9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
remove value: 0
1
poll value: 9
8
[8, 7, 6, 5, 4, 3, 2, 1]
0~9の値の挿入順がQueueと逆になっているのがわかりますね。
両方向から挿入可能なので、「LIFO(Last-in-First-out)/ 後入れ先出し法」を用いるスタックとして使用することも可能です。