Javaにおけるコレクションフレームワークの利用指針

Javaの復習のために調査したものをメモ。

コレクションとは

モノの集まりを表現するものであり、かつモノの集まりに対する操作を表現するモノ

Javaでは基本的でかつ汎用性の高いデータ構造・アルゴリズムを、コレクションフレームワークとして提供している。

List

順序どおりに並んだ集まり。多くの場合、インデックスを使用してアクセスする。

具象クラス

利用指針

ArrayList
  • インデックスを指定しての読み出し・書き換え速度が速い
  • 先頭から全てを順になめていく処理が速い
  • 要素の挿入・削除が遅いことがある。(先頭に近いほど遅い)
LinkedList
  • 要素の挿入・削除が速い
  • インデックスを指定しての読み出し・書き換えが遅い
  • 条件に合致した要素の検索(contains,indexOf,lastIndexOf)が早くない

要素の読み込み・書き換えが中心の場合、ArrayListを使用する。 要素の挿入や削除が中心の場合、LinkedListを使用する。

Map

キーと値のペアをの集まり。キーを使用して検索する。

具象クラス

  • HashMap
  • LinkedHashMap
  • TreeMap

利用指針

HashMap
  • 順序が不要な時。追加や検索が高速なため
    LinkedHashMap
    追加した順序やアクセスした順序が欲しい場合。(内部的にハッシュ表とLinkedListの両方を生成している)
    TreeMap

    2分探索木構造(詳しくはググること)のMap。任意の比較規則に従った順序が欲しい場合。 数値の大小順、辞書順等。 あいまい検索をしたい場合にはNavigatavleMapインターフェースを使用。

Set

重複のない要素の集まり。

具象クラス

  • HashSet
  • LinkedHashSet
  • TreeSet

Mapの具象クラスと名前が似ているのは、Mapの実装クラスをそのままSetでも利用しているため。 Mapのキーが重複してはいけないという点と意味が同じであることを利用。

利用指針もMapの利用指針を参考にすること。

Iterator

集合と繰り返しは強い関係があるため、セットで覚えること。

拡張for構文

//拡張for構文
for(Integer n : list) {
sum += n;
}

下記の理由がない場合はこちらを使用すること。(可読性や、後述する理由から)

  • コレクションの要素を逆順になめるとき
  • ループを途中で抜けたあと、再度同じ位置からループを再開したいとき(あまりないけど・・・)
  • コレクションをなめる最中で、要素の追加や削除を行うとき

Itaratorを使用したループ

//Iteratorを使用したループ
for(Iterator it = list.iterator(); it.hasNext();) {
Integer n = it.next();
sum += n;
}

最も柔軟な記述方法。 上記の理由で拡張for文が使えない場合、こちらの方法で記述可能。(疲れたので具体例は後日・・・)

インデックスを使用したforループ

//インデックスでforループをまわすパターン(あまり推奨しない)
for(int i = 0; i < list.size(); i++) {
Integer n = list.get(i);
sum += n;
}

あまりおすすめしない。 理由は、インデックスを利用するforループは、コレクション一般に利用できるコードではなく、リストにのみ適用可能な処理であるため。

とりあえず最低限はこんなところかなと。個人的にはTreeMap及びNavigatableMap、Iteratorのところは知らなかった部分もあったので、収穫ありでした。