コレクション フレームワーク

通常、複数のオブジェクトを管理するために配列を使います。しかし、配列は事前に配列の次元や要素の数を決めなければいけないなど、オブジェクトの動的な管理には適しません

これに対し、コレクションには配列にない、いくつかの特徴があります

初期化で要素数を指定する必要がない。
要素の追加・削除・挿入がメソッドを呼ぶことにより自由に行える。
要素のソーティングや検索がメソッドで可能。
コレクションはいくつかのインターフェースで仕様が決められているので、利用するクラスが異なっても同じ仕様のメソッドを利用して要素を管理することが出来る。
ただし、管理できるのは参照型のオブジェクトだけで基本型のデータは扱えない。必要な場合はラッパークラスとして定義し、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に送信しました。

>
以上が、クラスのインスタンスを集めて管理し、一括されたそれらの情報を利用する、配列とは違ったコレクションの利点です。

コレクション に戻る

Listインターフェース

コレクションフレームワークに属するListインターフェースは配列と同じように0からのインデックスで要素の集まりを扱います。
配列との大きな差は配列は要素の追加が出来ないのに対し、Listインターフェースは要素の追加・削除が可能なことです。
Listインターフェースのメソッドのうち、addメソッドは指定された要素をリストの最後に追加し、clearメソッドは指定された全ての要素をリストから削除し、removeメソッドは指定された要素をリストの先頭から探し、最初に見つかった同じ要素をリストから削除し、setメソッドはリスト内の指定された位置にある要素を、指定された要素に置き換えます。なお、addメソッドにはリスト内の指定された位置に、指定された要素を挿入するメソッド、removeメソッドには指定された位置にある要素を削除するメソッドもあります。
Listインターフェースの実装クラスで良く用いられるのはArrayListクラスです。
なお、ArrayListの宣言では扱う要素の型をジェネリックとして< >の中に記述し、それ以外の型のオブジェクトが追加されないようコンパイラーにチェックさせます。
また、要素の取り出しにはfor文、拡張for文、iteratorを使用します。
Listの実装クラスにArrayListを利用した例

import java.util.List;
import java.util.ArrayList;
import java.util.Iterator;

public class ListSample {
	public static void main(String[] args) {

		List<String> list=new ArrayList<>( ); 
		System.out.println(list.size());
		System.out.println("---------------");
		list.add("B");
		list.add("C");
		list.add(0, "A");
		for(int i=0; i<list.size(); i++) {
			System.out.println(list.get(i));
		} 
		System.out.println("---------------");
		list.add("A");
		for(String str: list) {
			System.out.println(str);
		}
		System.out.println("---------------");
		list.set(3, "D");
		for(Iterator<String> it = list.iterator(); it.hasNext();) {
			System.out.println(it.next());
		}
		System.out.println("---------------");
		list.remove(0);
		System.out.println(list);
	}
}

実行結果

>java ListSample
0
---------------
A
B
C
---------------
A
B
C
A
---------------
A
B
C
D
---------------
[B, C, D]

>

Listインターフェースを実装したクラスには、ArrayListのように要素を連続的に並べるのではなくリンク情報で関連付けたLinkedListがあります。LinkedListの機能はArrayListと変わりませんがリンク情報の書き換えで要素の挿入、削除が行えるのでArrayListよりもそれらの処理が早く行えます。しかし、逆に、連続的に要素を扱う読出しや書き込みはArrayListよりも処理が遅くなります。

Listの実装クラスにLinkedListを利用した例

import java.util.List;
import java.util.LinkedList;
import java.util.Iterator;

public class LinkedListSample {
	public static void main(String[] args) {

		List<String> list=new LinkedList<>( ); 
		System.out.println(list.size());
		System.out.println("---------------");
		list.add("B");
		list.add("C");
		list.add(0, "A");
		for(int i=0; i<list.size(); i++) {
			System.out.println(list.get(i));
		} 
		System.out.println("---------------");
		list.add("A");
		for(String str: list) {
			System.out.println(str);
		}
		System.out.println("---------------");
		list.set(3, "D");
		for(Iterator<String> it = list.iterator(); it.hasNext();) {
			System.out.println(it.next());
		}
		System.out.println("---------------");
		list.remove(0);
		System.out.println(list);
	}
}

実行結果
同じインターフェースを実装しているので実行結果に違いはありません。

>java ListSample
0
---------------
A
B
C
---------------
A
B
C
A
---------------
A
B
C
D
---------------
[B, C, D]

>

コレクション に戻る