Rainbow Engine

IT技術を分かりやすく簡潔にまとめることによる学習の効率化、また日常の気付きを記録に残すことを目指します。

Java

JavaのDequeの概要や使い方+サンプルプログラムもご紹介

投稿日:2021年3月18日 更新日:

<目次>

(1) JavaのDequeの概要や使い方+サンプルプログラムもご紹介
 (1-1) Dequeとは?
 (1-2) Dequeを実装したクラス
 (1-3) Dequeの使い方
 (1-4) Dequeのサンプルプログラム

(1) JavaのDequeの概要や使い方+サンプルプログラムもご紹介

(1-1) Dequeとは?

「Deque」はJavaAPIが提供するスタック機能を持つインターフェイスです(java.util.Deque)。「double ended queue」の略で、キューの両端から要素を追加・削除できるのが特徴です。読み方は「デック」と読み、dequeue(デキュー=キューからデータを取り出し)とは異なるため注意が必要です。
 
両端からの追加・削除が可能であるため、キュー(First In First Out)とスタック(Last In First Out)の両方の用途で使う事ができます。
 
そのために多くのメソッドが用意されています。
(表①)Dequeインターフェイスのメソッド
■メソッド名
※カッコ()内は別名
■作用箇所 ■機能 ■例外時
addFirst
(push)
先頭 追加(挿入) 例外を発生
offerFirst 先頭 追加(挿入) falseやnullを返却
removeFirst
(pop, remove)
先頭 取得(削除) 例外を発生
pollFirst
(poll)
先頭 取得(削除) falseやnullを返却
getFirst
(element)
先頭 参照(検査) 例外を発生
peekFirst
(peek)
先頭 参照(検査) falseやnullを返却
addLast
(add)
末尾 追加(挿入) 例外を発生
offerLast
(offer)
末尾 追加(挿入) falseやnullを返却
removeLast 末尾 取得(削除) 例外を発生
pollLast 末尾 取得(削除) falseやnullを返却
getLast 末尾 参照(検査) 例外を発生
peekLast 末尾 参照(検査) falseやnullを返却
「java.util.Queue」インターフェイスを継承しているため、DequeではQueueインターフェイスに定義されたメソッドも使う事ができます(add、element、offer、peek、poll、remove)。また処理によっては複数のメソッド名が記載されているものもありますが、これらは従来のインターフェイスとの互換の関係で、全く同じ機能だが名前が違うメソッドがある状態となっており、どちらを使っても問題ないですが、どれかに統一する事が望ましいです(例えばaddFirstとpushは全く同じ機能)。
 
(参考)
似たクラスで「java.util.stack」パッケージの「Stack」クラスがありますが、こちらの方が古く、同じ処理がDequeで出来るため、特にこだわりが無ければDequeを使うと良いかも知れません。
 

(1-2) Dequeを実装したクラス

Dequeインターフェイスを実装したクラスは、以下がJavaのAPIとして用意されています。

①java.util.LinkedList
②java.util.ArrayDeque
 
①の「LinkedList」はDeque及びQueueを実装したスタンダードなクラスで、内部的にはLinked Listにより要素を保持します。
②の「ArrayDeque」は内部的には配列に要素を格納しており、要素数が予め確保した領域を上回ると、新しく必要なサイズの配列を確保しなおし、要素はそちらに引っ越しします
 

(1-3) Dequeの使い方+サンプルプログラム

STEP1:Dequeのインスタンス作成

Dequeのインスタンスは、Dequeインターフェイスを実装したLinkedListクラスやArrayDequeクラスをインスタンス化する事で作れます。

(例)
Deque<String> dq1 = new ArrayDeque<>();
Deque<String> dq2 = new LinkedList<>();

STEP2:各メソッドを利用してキューやスタックの操作

あとは前節でご紹介した(表①)のメソッドを使って、要素を追加・削除して使います。「スタック」として利用した例と、「キュー」として利用した例をそれぞれご紹介します。
 

(1-4) Dequeのサンプルプログラム

「キュー」のサンプルと「スタック」のサンプルをそれぞれご紹介します。

キューのサンプルプログラム

import java.util.Deque;
import java.util.LinkedList;

public class IT0285_QueueSample {
    public static void main(String[] args) {
        Deque<String> que = new LinkedList<>();
        try {
            //「最上」の要素を「挿入」
            que.addLast("Apple");
            que.addLast("Banana");
            que.addLast("Coffee");
            System.out.println("# ①:"+que);

            //「最上」の要素を「削除」
            System.out.printf("### dequeue:%20s\n",que.removeFirst());
            //「最上」の要素を「参照」
            System.out.printf("### getFirst:%20s\n",que.getFirst());
            //「最上」の要素を「挿入」
            que.addLast("Donuts");
            System.out.println("# ②:"+que);

            //「最上」の要素を「削除」
            System.out.printf("### dequeue:%20s\n",que.removeFirst());
            System.out.printf("### dequeue:%20s\n",que.removeFirst());
            System.out.printf("### dequeue:%20s\n",que.removeFirst());
            System.out.println("# ③:"+que);

            //「最上」の要素を「削除」
            //→要素が1つもないため、例外が発生
            System.out.printf("### dequeue:%20s\n",que.removeFirst());
        } catch (Exception e) {
            System.out.println(e);
        }
    }
}

(図141)実行結果

目次にもどる

スタックのサンプルプログラム

import java.util.ArrayDeque;
import java.util.Deque;

public class IT0285_StackSample {
    public static void main(String[] args) {
        Deque stk = new ArrayDeque<>();
        try {
            //「最上」の要素を「挿入」
            stk.push("Apple");
            stk.push("Banana");
            stk.push("Coffee");
            System.out.println("# ①:"+stk);

            //「最上」の要素を「削除」
            System.out.printf("### pop:%21s\n",stk.pop());
            //「最上」の要素を「参照」
            System.out.printf("### peek:%20s\n",stk.peek());
            //「最上」の要素を「挿入」
            stk.push("Donuts");
            System.out.println("# ②:"+stk);

            //「最上」の要素を「削除」
            System.out.printf("### pop:%21s\n",stk.pop());
            System.out.printf("### pop:%21s\n",stk.pop());
            System.out.printf("### pop:%21s\n",stk.pop());
            System.out.println("# ③:"+stk);

            //「最上」の要素を「削除」
            //→要素が1つもないため、例外が発生
            System.out.printf("### pop:%21s\n",stk.pop());

        } catch (Exception e) {
            System.out.println(e);
        }
    }
}

(図142)実行結果

目次にもどる

Adsense審査用広告コード


Adsense審査用広告コード


-Java

執筆者:


comment

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

関連記事

JNDIとは?JDBCとの違いやメリット・デメリットについてもご紹介

<目次> (1) JNDIとは?JDBCとの違いやメリット・デメリットについてもご紹介  (1-1) JDBCとは?  (1-2) JNDIとは?   (1-2-1) 概要   (1-2-2) JND …

getParameterとgetAttributeの違いやJSPからServletへの値の受け渡し

<目次> (1) getParameterとgetAttributeの違いやJSPからServletへの値の受け渡し  (1-1) 前半:request.getParameterについて   ●概要 …

JSPとは?役割や基本文法およびHelloWorldのサンプルプログラムの紹介

(0)目次&概説 (1) JSPの基本  (1-1) JSPとは?  (1-2) JSPのHelloWorld (2) JSPの基本文法  (2-1) ディレクティブ  (2-2) アクションタグ   …

Servlet/JSPで日本語文字が「???」になる問題とFilterの活用について

(0)目次&概説 (1) 事象 (2) 原因 (3) 対処方法1  (3-1) フィルタクラスの新規作成  (3-2) フィルタクラスへのコード追加  (3-3) 疎通確認テスト (4) 対処方法2 …

Javaのenumでフィールドを複数定義したり、値を取得する方法

<目次> (1) Javaのenumでフィールドを複数定義したり、値を取得する方法  (1-1) enumでフィールドを定義・取得する  (1-2) enumでフィールドを複数定義・取得する (1) …

  • English (United States)
  • 日本語
Top