Javaにおけるコレクションフレームワークの利用指針
Javaの復習のために調査したものをメモ。
コレクションとは
モノの集まりを表現するものであり、かつモノの集まりに対する操作を表現するモノ
Javaでは基本的でかつ汎用性の高いデータ構造・アルゴリズムを、コレクションフレームワークとして提供している。
List
順序どおりに並んだ集まり。多くの場合、インデックスを使用してアクセスする。
具象クラス
- ArrayList
- LinkedList
利用指針
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(Iteratorit = 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のところは知らなかった部分もあったので、収穫ありでした。