LIFOを管理するStackクラス
この他にも、Javaには多数のオブジェクトを扱うためのクラスがあります。中でも、やや特殊な使われ方をするものとして「Stack」クラスについても紹介しておきましょう。このStackは、正確にはコレクション・フレームワークのクラスではないのですが、「多数のオブジェクトを扱うためのもの」としてここでまとめて覚えておいてください。
Stackは、「LIFO(Last In First Out、後入れ先出し)」を実現するためのものです。例えば、「A」「B」「C」といった値を順に収めていったとき、そこから値を順に取り出してみると今度は「C」「B」「A」というように、後から入れたものから順に取り出されていく、これがLIFOです。
[Stack].push( オブジェクト );
Object 変数 = [Stack].pop();
boolean 変数 = [Stack].empty();
このStackにもaddやremoveのメソッドはあるのですが、これらは「使ってはいけない」と考えてください。なぜなら、これらを使用してしまうと、LIFOのデータの構造が崩れ、並び順が保障されなくなる可能性があるからです。Stackはpushで保管し、popで取り出すのが基本です。
package codezine.java; import java.util.*; public class Sample { public static void main(String[] args) { Stack stack = new Stack(); System.out.print("PUSH: "); for(int i = 0;i < 10;i++){ System.out.print(i + " "); stack.push(i); } System.out.println(); System.out.print("POP: "); while(!stack.empty()){ try { Object obj = stack.pop(); System.out.print(obj + " "); } catch(EmptyStackException ex){ break; } } System.out.println(); } }
ここでは、0~9の値をpushで保管し、それをpopで空になるまで取り出して表示しています。収めた順と、取り出される順が逆になっていることがよく分かるでしょう。
ここでのポイントは値の取出しです。whileでstack.empty()をチェックして、これがtrueになるまで繰り返しを続けます。この他、あまり一般的ではないですが「popしてエラーになったら繰り返しを抜け出す」という処理も入れておきました。popは、既に中身が空になった状態で実行されると、EmptyStackExceptionという例外を発生します。それを利用して、catchでbreakして繰り返しを抜けています。
今回はwhileでチェックをしているのでこの処理は不要なのですが、例えばpushとpopが入り乱れているような処理では、「pop時の例外をチェックする」というやり方も覚えておくと便利でしょう。
まとめ
今回は、コレクション・フレームワークの主なクラスについてその働きと使い方を説明しました。正直いって「配列ぐらいしか使わないんじゃないかな」なんて思っている人もいるのではないでしょうか。
コレクション・フレームワークは、非常に地味なライブラリです。似たようなクラスがたくさんあり、それぞれ微妙に動作が違うので、なんとなく勉強するのも面倒な感じがするかもしれません。
ところが、コレクション・フレームワークは、実にさまざまなところで使われているのです。多数のオブジェクトを管理するようなシーンで、コレクション関係のクラスは必ずといっていいほど使われています。特に、SwingなどのGUIを利用するようになると、オブジェクト類を管理するのにここで登場したクラスは多用することになります。
まずは、基本中の基本であり、最も汎用性の高いArrayListあたりを使って、コレクションの考え方に慣れておきましょう。こうした「地味だが基礎的なクラス類」が自在に使えるようになることで、Swingなどの高度な機能も次第に抵抗なく使えるようになってくるのですから。

