コレクション フレームワーク
通常、複数のオブジェクトを管理するために配列を使います。しかし、配列は事前に配列の次元や要素の数を決めなければいけないなど、オブジェクトの動的な管理には適しません。
これに対し、コレクションには配列にない、いくつかの特徴があります。
–
初期化で要素数を指定する必要がない。
–
要素の追加・削除・挿入がメソッドを呼ぶことにより自由に行える。
–
要素のソーティングや検索がメソッドで可能。
–
コレクションはいくつかのインターフェースで仕様が決められているので、利用するクラスが異なっても同じ仕様のメソッドを利用して要素を管理することが出来る。
–
ただし、管理できるのは参照型のオブジェクトだけで基本型のデータは扱えない。必要な場合はラッパークラスとして定義し、AutoBoxingで自動変換して扱う。
コレクションフレームワークは性質の若干異なるList、Set、Mapなどにより構成され、それぞれにインターフェースが定義され、それぞれを実装したクラスが用意されているので、実際の課題ごとに適切はクラスを選択して使います。
それぞれの特徴、利用法は下記を参照してください。
Listインターフェース
Setインターフェース
Mapインターフェース
以上でコレクションフレームワークの仕様と基本的な利用法は理解できたと思いますが、コレクションは「参照型のオブジェクト」を管理する仕組み、という実際の利用効果を見てみましょう。
参照型のオブジェクトとは簡単に言えばクラスですから、クラスのインスタンスを集めて管理できるという事です。さらに、クラスが継承関係を持っていれば、スーパクラスと合わせてサブクラスのインスタンスも合わせて一括管理が出来るという事です。
参照型のオブジェクトとは簡単に言えばクラスですから、クラスのインスタンスを集めて管理できるという事です。さらに、クラスが継承関係を持っていれば、スーパクラスと合わせてサブクラスのインスタンスも合わせて一括管理が出来るという事です。
それでは、電話番号を管理するPhoneクラスを作り、継承によって電話番号と合わせてEmailアドレスも管理するmobileクラスを作って、それらのインスタンスをListArrayに入れて一括管理し、Phoneとmobileを使い分けながら利用するところを見てみましょう。
まず、Phoneクラス
public class Phone { private String no; public Phone(String myNo) { this.no = myNo; } public String getNo() { return no; } public void setNo(String no) { this.no = no; } public void call(String to) { System.out.println("電話番号" + no + "番から、電話番号" + to + "番に電話しました。"); } }
次に、Phoneクラスを継承したMobileクラス
public class Mobile extends Phone { private String emAdd; public Mobile(String no, String myEmAdd) { super(no); this.emAdd = myEmAdd; } public String getEmAdd() { return emAdd; } public void setEmAdd(String emAdd) { this.emAdd = emAdd; } public void mobileInfo() { System.out.println("私の携帯の電話番号は" + super.getNo() + "番で、メールアドレスは" + emAdd + "です。"); } public void send(String to) { System.out.println("メールを" + emAdd + "から、" + to + "に送信しました。"); } }
さらに、PhoneクラスとMobileクラスを一括管理して使う処理です。
import java.util.*; public class MyPhones { public static void main(String[] args) { List<Phone> pList = new ArrayList<>(); pList.add(new Phone("0123-45-6789")); pList.add(new Mobile("090-8765-4321", "abcd@efgh.ijk.lm")); pList.add(new Phone("0234-56-7890")); System.out.println(pList); for(Phone use : pList) { use.call("0120-333-4444"); } System.out.println("-----------------------"); Mobile mbl = (Mobile)pList.get(1); mbl.mobileInfo(); mbl.send("opqr@stu.vw.xyz"); } }
実行結果
>java MyPhones [Phone@15db9742, Mobile@6d06d69c, Phone@7852e922] 電話番号0123-45-6789番から、電話番号0120-333-4444番に電話しました。 電話番号090-8765-4321番から、電話番号0120-333-4444番に電話しました。 電話番号0234-56-7890番から、電話番号0120-333-4444番に電話しました。 ----------------------- 私の携帯の電話番号は090-8765-4321番で、メールアドレスはabcd@efgh.ijk.lmです。 メールをabcd@efgh.ijk.lmから、opqr@stu.vw.xyzに送信しました。 >
以上が、クラスのインスタンスを集めて管理し、一括されたそれらの情報を利用する、配列とは違ったコレクションの利点です。