知っていると便利な章

4.4. List

Collectionを拡張して要素に「順序をつけたもの」です。

『JDK7 API Javadoc より抜粋』---
順序付けられたコレクションです。「シーケンス」とも呼ばれます。
このインターフェースのユーザーは、リスト内のどこに各要素が挿入されるかを精密に制御できます。 ユーザーは整数値のインデックス (リスト内の位置) によって要素にアクセスしたり、 リスト内の要素を検索したりできます。
---

Listインターフェースでは、インデックス番号で要素を操作するメソッドが定義されています。
get、listIterator、indexOfが代表的なメソッドです。

以下のクラスは List インターフェースを実装しているクラスです。

ArrayList
配列で実装されたListです。
インデックス指定のget、setの呼び出しが高速です。
ただしリストの中間への挿入や削除には時間がかかります。

LinkedList
双方向リストです。
ArrayListと逆の特徴を持ちます。
インデックス指定のget、setの呼び出しは遅くて、 リスト中間への挿入と削除が早いです。
先端の要素・終端の要素に対して操作できるメソッドを持っているので、 スタックやキューとして使うことができます。
メモリを気持ち多めに使います。

Vector
ArrayList との違いは、同期化されていることです。
ただし、あえて使う理由はありません。
HashtableとVectorを参照してください。

このように使います。

List<String> strings = new ArrayList<>();
:
// リストサイズを数万件にする。
:
// リストの先頭に要素を追加          ... (a)
strings.add(0, "あ");

// リストの最後に要素を追加          ... (b)
strings.add("い");

// リストのインデックス10000の要素を置換 ... (c)
strings.set(10000, "え");

// リストのインデックス10000の要素を返す ... (d)
strings.get(10000);

// リストのインデックス1の要素を削除
strings.remove(1);

// 指定された要素のインデックス返却
if (strings.indexOf("お") > -1) { 
    System.out.print("「お」がリストにあります。");
}

上記ソースの(a)(b)(c)(d)について、ArrayListとLinkedListの実行速度を比較しました。
数万回の繰り返し処理を行うと以下のように処理時間に大きく差が出てきます。

< 前のページへ

Pagetop