4.4. List
Collectionを拡張して要素に「順序をつけたもの」です。
『JDK1.4 API Javadoc より抜粋』---
順序付けられたコレクションです。「シーケンス」とも呼ばれます。
このインターフェースのユーザは、リスト内のどこに各要素が挿入されるかを精密に制御できます。
ユーザは整数値のインデックス (リスト内の位置) によって要素にアクセスしたり、
リスト内の要素を検索したりすることができます。
---
Listインターフェースでは、インデックス番号で要素を操作するメソッドが定義されています。
get、listIterator、indexOfが代表的なメソッドです。
以下のクラスは List インターフェースを実装しているクラスです。
ArrayList
Listのデフォルト実装です。
配列で実装されています。
インデックス指定のget、setの呼び出しが高速です。
ただしリストの中間への挿入や削除には時間がかかります。
LinkedList
双方向リストです。
ArrayListと逆の特徴を持ちます。
インデックス指定のget、setの呼び出しは遅くて、
リスト中間への挿入と削除が早いです。
先端の要素・終端の要素に対して操作できるメソッドを持っているので、
スタックやキューとして使うことができます。
メモリを気持ち多めに使います。
Vector
ArrayList との違いは、同期化されていることです。
ただし、あえて使う理由はありません。
HashtableとVectorを参照してください。
このように使います。
List strings = new ArrayList();
// リストの先頭に要素を追加 ... (a)
strings.add(0, "あ");
// リストの最後に要素を追加 ... (b)
strings.add("い");
// リストのインデックス0の要素を置換 ... (c)
strings.set(0, "え");
// リストのインデックス0の要素を返す ... (d)
strings.get(0);
// リストのインデックス1の要素を削除
strings.remove(1);
// 指定された要素のインデックス返却
if (strings.indexOf("お") > -1) {
System.out.print("「お」がリストにあります。");
}
上記ソースの(a)(b)(c)(d)について、ArrayListとLinkedListの実行速度を比較しました。
数万回の繰り返し処理を行うと以下のように処理時間に大きく差が出てきます。
| List |
先頭追加処理
(a) |
最後追加処理
(b) |
置換処理
(c) |
検索処理
(d) |
| ArrayList |
14406 |
94 |
0 |
15 |
| LinkedList |
0 |
110 |
4218 |
4375 |