SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

作って覚えるJavaプログラミングのススメ

Java入門 (7) - List・Map・Setなどのコレクション・フレームワーク

作って覚えるJavaプログラミングのススメ 第7回

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);
        }
    }
}
実行すると、ArrayListに収めてあるオブジェクトを順に書き出す。
実行すると、ArrayListに収めてあるオブジェクトを順に書き出す。

 これは、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が新たに用意されているのでこちらを使うことが多いようですが、基本的にはどちらを使ってもほぼ同じようなことができます。

次のページ
HashMapによるMapの利用

この記事は参考になりましたか?

作って覚えるJavaプログラミングのススメ連載記事一覧

もっと読む

この記事の著者

掌田 津耶乃(ショウダ ツヤノ)

三文ライター&三流プログラマ。主にビギナーに向けたプログラミング関連の執筆を中心に活動している。※現在、入門ドキュメントサイト「libro」、カード型学習サイト「CARD.tuyano.com」を公開...

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/2385 2008/04/17 14:00

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー