2. ListとIterator
2.1. java.util.List, java.util.ArrayList, java.util.LinkedList
Java2 SDK1.2からコレクションクラスは「Java コレクション・フレームワーク」(JCF)として大幅に見直されました。機能をインタフェースとして定義し直し、その機能の実装を各クラスに委ねると言う形式になっています。したがって各クラスではどのインタフェースを実装しているかで、どのような機能を持っているか把握する事もできます。
コレクション・フレームワークでは上記のような見直しに伴い、これまでの「Vector」「Hashtable」も見直す事になりました。「Vector」の代わりに導入されたのが「java.util.ArrayList」と「java.util.LinkedList」です。これらは「java.util.List」インタフェースを実装するクラスで、順序付けられた可変個の値を保持する事ができます。「Vector」も互換性のために残されていますが(「List」インタフェースも実装している)、これからは「ArrayList」か「LinkedList」を使用するのが良いでしょう。
「List」インタフェースは「追加」「挿入」「削除」「検索」「ランダムアクセス」のメソッドを定義しています。従って「ArrayList」「LinkedList」はそれらのメソッドを実装している事になります。以下は主要なメソッドの一覧です。
boolean add(Object) | リストの最後に挿入する |
boolean add(int, Object) | 第1引数で指定されたインデックスに、オブジェクトを挿入する |
boolean addAll(Collection) | 引数で指定された要素を全て、最後に挿入する |
boolean addAll(int, Collection) | 第1引数で指定されたインデックス以降に、第2引数で指定された要素を全て挿入する |
void clear() | リストをクリアする(全ての要素を削除する) |
boolean contains(Object) | 引数で指定されたオブジェクトが含まれている場合に「true」を返す |
Object get(int) | 引数で指定されたインデックスにあるオブジェクトを返す |
int indexOf(Object) | 引数で指定されたオブジェクトが最初に見つかったインデックスを返す |
int lastIndexOf(Object) | 引数で指定されたオブジェクトを、最後から探して最初に見つかったインデックスを返す |
Object remove(int) | 引数で指定されたインデックスにあるオブジェクトを削除する |
Object set(int, Object) | 第1引数で指定されたインデックスにあるオブジェクトを、第2引数のもので置き換える |
int size() | 要素数を返す |
List subList(int, int) | 引数で指定された範囲の要素をコピーして新しいリストを返す |
Object[] toArray(Object[]) | 引数で指定した型の配列に、リストを変換して返す |
以下は「add」「get」メソッドの使用例です。「Vector」の時と同じく、「get」の返り値は「Object」ですのでキャストする必要があります。
List list = new ArrayList(); list.add("japan"); list.add("china"); String country = (String)list.get(1);
「toArray」メソッドには引数無しのタイプのものもありますが、確実にプログラムを動作させるためには引数があるタイプのものを使用するのが適当です。以下はその使用例です。
String[] countries = (String[])list.toArray(new String[list.size()]);
最後に「ArrayList」と「LinkedList」の違いを説明します。この2つの違いは内部実装方法の違いで、「ArrayList」は配列として実現しているのに対し「LinkedList」はリスト構造を用いて実現しています。そのため両者は処理によって動作速度が以下のように異なります。アプリケーションの性質によって使い分けると良いでしょう。
ランダムアクセス | 検索 | 追加 | 挿入 | 削除 | |
---|---|---|---|---|---|
ArrayList | ◎ | △ | ◎ | △ | △ |
LinkedList | △ | △ | ◎ | ◎ | ◎ |
(実習課題1)
「ArrayList」と「LinkedList」の性能を比較するプログラムを作成しなさい。
- あらかじめ100万個の要素をリストに追加しておく。
- それに対して「ランダムアクセス」「検索」「追加」「挿入」「削除」メソッドの実行に掛かる時間を計測し、表示する事。
- (ヒント)時間の計測には「System」クラスの「currentTimeMillis」メソッドを使用する。