ArrayListでオブジェクトを管理する
まずは、多数のオブジェクトを順番に管理する「List」からです。このListを実装したクラスとしては、「ArrayList」と呼ばれるものが最もよく用いられるでしょう。ArrayListは、メソッドを呼び出していくつでもオブジェクトを保管しておくことができます。主なメソッド類を整理しておきましょう。
[ArrayList].add( オブジェクト ); [ArrayList].add( インデックス番号 , オブジェクト );
[ArrayList].remove( オブジェクト ); [ArrayList].remove( インデックス番号 );
Object 変数 = [ArrayList].get( インデックス番号 );
[ArrayList].set( インデックス番号 , オブジェクト );
int 変数 = [ArrayList].size();
ArrayListは、インデックス番号を使ってオブジェクトを管理しています。「add」を使ってオブジェクトを追加すると、新たにインデックス番号をつけてオブジェクトを保管します。この番号はゼロから順番に割り振られていきます。保管してあるオブジェクトを取り出したいときは、getで取り出したいインデックス番号を指定します。
オブジェクトのキャスト
ArrayListを使うときに注意しておきたいのは、「保管したオブジェクトは、原則としてObjectクラスのインスタンスとして取り出される」という点です。このObjectというのは、java.langパッケージに用意されている、すべてのクラスの土台となるものです。Javaでは、あらゆるクラスはすべてObjectを継承して作られています。「何も継承していないクラスもあるのでは?」と思うでしょうが、実はこうしたものも自動的にObjectを継承して作られるようになっているのです。
ArrayListに限らず、コレクション関係のクラスは、さまざまなクラスのインスタンスを保管しておくことができます。ということは、その中にどういうクラスのインスタンスが収められているのかわからない、ということでもあります。何が入っているのかわからないのでは、値を取り出すときに困ってしまいます。
そこで、値を取り出すときは、必要に応じて「キャスト」して利用するようになっています。キャストは型の変換と呼ばれるもので、ある種類の値を別の種類に変換するときに使います。これは、
(クラス名)インスタンス
このように、インスタンスの前に変換したいクラス名をカッコでくくって記述します。ただし、何でも変換できるわけではありません。インスタンスで変換できるのは、「そのクラスのスーパークラスやサブクラス」だけです。
例えば、「Sample」というクラスのインスタンスをArrayListに入れていて、それを取り出すときにはこのようにします。
Sample sample = (Sample)arraylist.get(0);
これで、get(0)で取り出したものをSampleに戻すことができます。このキャストは、ここでのgetのように「一時的にスーパークラスに変換し、それをまた元のクラスに戻す」というような使い方をのに用いられます。ArrayListでは、インスタンスを保管すると、すべてのクラスの1番土台となるスーパークラスObjectに変換します。そして、それを取り出すときに(元のクラスに戻すために)キャストを使う、というわけです。
決して、勝手に他のクラスにキャストして使えるわけではないので注意してください。これ以外の使い方でキャストをしようとすると、「キャストができません」という例外が発生しますから注意しましょう。
ArrayListの全要素を取り出す
では、ArrayListを利用した例を挙げておきましょう。ArrayListはgetで必要なものだけを取り出して使うこともできますが、「中に収めてあるものを順に取り出し、すべてに処理をする」ということもできます。
package codezine.java; import java.util.*; public class Sample { public static void main(String[] args) { ArrayList list = new ArrayList(); list.add("Yamada"); list.add(new Date()); list.add(123 + 456); for(Object obj:list){ System.out.println(obj); } } }
これは、addでサンプルとしていくつか値を保管し、それらすべてを順に取り出して表示するというものです。ここでは、String値、日付を扱う「Date」クラスのオブジェクト、そしてint値をそれぞれ保管しています。addを見ると引数にさまざまな値が設定されている点が分かると思います。
ラッパークラスとオート・ボクシング
コレクション・フレームワークを扱うとき、忘れてはならないのが「オブジェクトを保管するものである」という点です。つまり、オブジェクトではない普通の値(整数とか実数など)は保管できないのです。ところが、リストを見ると整数の値をそのままaddしていることが分かります。この部分は、本来であればこう書かなければいけないのです。
list.add(new Integer(123 + 456));
「Integer」は、int値をオブジェクトとして扱うために用意されているクラスです。コレクション・フレームワークのように「オブジェクトしか使えない」というようなもので整数や実数などのオブジェクトでない値を使うとき、こうしたクラスを利用します。これらは、単に整数などの値をラップする(くるむ)ために用意されているため「ラッパークラス」と呼ばれます。
本来、ラッパークラスを使わなければいけなかったint値も、Java 5より用意された「オートボクシング」と呼ばれる機能のおかげでそのままaddできるようになりました。これは、整数や実数などのオブジェクトではない値を、必要に応じてそれらの値を扱うためのクラスのインスタンスに自動変換してくれる機能です。例えば、整数の値(int値)は、これをオブジェクトとして扱うための「Integer」というクラスのインスタンスに変換されます。
なお、取り出した値もそのままintにキャストすれば、自動的にIntegerからintに戻されるようになっています。
コレクションとfor
さて、繰り返しを使って値を取り出す部分を見てみましょう。ここでは、forを使っていますが、これは配列などの要素を取り出すのに用いられる特別なforです。
for( 変数 : 配列またはコレクション )
このようにすることで、配列またはコレクションから1つずつ値を取り出し変数に収めていきます。このforとの組み合わせはよく使われますので、ここで覚えておきましょう。
ArrayListと同じような働きをするものとして、「Vector」というクラスも用意されています。これもArrayListと同様にaddやremove、set、getといったメソッドを使って値を操作できます。Vectorはコレクション・フレームワークが登場する前から使われていたクラスです。今はArrayListが新たに用意されているのでこちらを使うことが多いようですが、基本的にはどちらを使ってもほぼ同じようなことができます。

