いろいろあるからね、しょうがないよね?
注意
- 当記事では、私が普段よく使うデータ構造の話だけをしています。当記事で触れられていない技術もこの世にはたくさんあります。
- 当記事には「これはあまり使わない」や「こうすればよさそう」といった個人的見解が多く含まれていますが、これは普段私がコーディングしている現場での話であり、私にとって無用なものも私以外にとっては有用かもしれません。
List(リスト)
-
ArrayList
- いつものやつ。
-
LinkedList
- 連結リストなので先頭要素のremoveとかが高速、だがあまり使わないかも。
配列に慣れちゃうと、list.add(5, "hoge");
みたいな感じで途中挿入できることを忘れがち。
Set(集合)
-
HashSet
- 高速。普段はこっちを使う。
-
TreeSet
- アイテムが自動的にソートされており、lower()やhigher()が使える。
Setは重複を持てない。既に持っているアイテムを再びaddしても何も起きない(例外発生もしない)。
addした順序も覚えていない(get()のようなメソッドが無い)。
Listと比べるとcontainsやremoveが高速。
Map(連想配列)
-
HashMap
- いつものやつ。put順序は覚えていない。
-
LinkedHashMap
- put順序を覚えている。
-
TreeMap
- put順序は覚えず、キーで自動的にソートされる。
map.entrySet()
のfor文で中身列挙する際、上記のどれを使っていたかによって順序が異なる。
ちなみに当たり前だがキーは重複できない。既に持っているキーを再びputすると、バリューが上書きされる。
Deque(両端キュー/デック)
-
ArrayDeque
- スタックとしてもキューとしても使えるやつ。
- スタックっぽく使うなら…
- push()で先頭に追加、peek()で先頭を見るだけ、pop()で先頭を削除。
- 両端キューっぽく使うなら…
- addFirst()やaddLast()で追加、peekFirst()やpeekLast()で見るだけ、pollFirst()やpollLast()で削除。
Queueを拡張して作られたのがDequeとのこと。特別な理由がない限りDequeを使えばよさそう(Queueは使わなくてよさそう)。
いったん以上。