第7回 コレクション

Listインタフェース

動的にサイズを変更できる配列。

Listインタフェースの実装
java.util.Vector

スレッドセーフなので、コード内にsynchronizedブロックが多数存在。
複数のスレッドでVectorを安全に使用できるが、性能は低下。

java.util.ArrayList

Vectorの同期問題をJDK1.2で解決したもの。同期を取らないVector

java.util.LinkedList

前のオブジェクトと次のオブジェクトへの参照を持つList。
データ構造の世界ではダブルリンクリストと呼ぶほうが正確。
データの挿入削除が多いならこれを、データに迅速にアクセスするなら、
java.util.ArrayListを使う。


結論:
動的な配列がほしければ、だいたいArrayList

Mapインタフェース

いわゆるハッシュ。

Mapインタフェースの実装
java.util.Hashtable

いわゆるハッシュ。内部で同期をとる。

java.util.HashMap

いわゆるハッシュ。同期をとらない。

java.util.LinkedHashMap

キーをソート順に格納できるハッシュ。
ソート処理があるのでそのぶん遅い。

java.util.IdentitiyHashMap

オブジェクトを等値ではなく同一化どうかで比較するハッシュ。

java.util.WeakHashMap

キーを弱い参照で格納するハッシュ。

java.util.TreeMap

バイナリーツリーでデータを保存するハッシュ。
ソート処理が入る。


結論:
ハッシュがほしければ、だいたいHashMap。
でも、動的型付け言語でハッシュを使う場面と、
使われ方はちょっと違う。動的型付け言語でハッシュがほしい場面の場合、
JavaではJava Beans(単なるC言語でいう構造体のようなクラス)を使うことが多い。

Setインタフェース

ハッシュのキーの部分だけを操作するデータ構造。重複をさけるようなデータ構造の操作に使用。

Setインタフェースの実装
java.util.HashSet

HashMapのキーの集合だけで実装されたもの。

java.util.LinkedHashSet

Set内のオブジェクトをLinkedListで保持。

java.util.TreeSet

内部でTreeMapでデータを保持。


結論:
セットがほしければ、だいたいHashSet。

注意

結論部分は、個人的意見であり、場面場面でその場にあわせた選択が必要。
この記事は以下の参考資料を元に自分の理解を整理するためのものである。


参考資料:

Java魂―プログラミングを極める匠の技

Java魂―プログラミングを極める匠の技