Javaのコレクション、どれ使えばいいの?使い分けや違いを一覧で紹介!
背景
Javaのコレクションは、ありがたいことにたくさんあります。
便利な反面結局どれ使えば一番いいのか、わかりにくかったりします。
そして何より、ちょっと使ってないと、ふと忘れます。
なので簡単にまとめてみました。
コレクションの種類と特徴
改めてJavaのコレクションの種類とその特徴を超簡単にまとめます。
List
インデックス(管理番号)で管理して保持します。
順序に焦点を当てたコレクションです。
Map
キーと値を紐づけて保持します。
データの紐づけに焦点を当てたコレクションです。
Set
重複しない値を保持します。
重複データを作成しないところに焦点を当てたコレクションです。
Queue・Deque
FIFO・LIFOです。
要素の最初・最後に焦点を当てたコレクションです。
自分なりのコレクションの決め方
実装クラスを知っていると、実は順序はどのコレクションでも保持はできます。
つまり順序を保持するかしないかは、あまり意識はしなくても大丈夫です。
なので私は以下の順番で決めていってます。
キーと値の紐づけが必要か?
2つ以上の値を紐づけないといけないのなら、Map一択です。
やろうと思えば他のコレクションでもできますが、可読性が落ちます。
重複値をどうするか?
同じ値を1つしか保持しない場合Set一択です。
2つ以上保持する場合はList・Queue・Dequeですね。
途中の要素を操作するかどうか?
途中の要素を一切触らないのであれば、Queue・Deque一択です。
用途が定まらないとか、全体的に操作する可能性があるのあれば、List・Setですね。
パフォーマンス最適解はどれか?
最後いきなり難しくなりましたけど、どういうデータ操作傾向かを見ます。
データ挿入・参照・変更・削除の量や位置、
その変数の利用用途によって変わってくるので、
残りの選択肢の中からベストな型を選んでます。
超雑な早見表はこんな感じです。
クラス | 特徴 |
---|---|
ArrayList | 参照が多い |
LinkedList | 変更が多い |
HashMap HashSet |
順序保持が不要 |
LinkedHashMap LinkedHashSet |
挿入順保持が必要 |
TreeMap TreeSet PriorityQueue |
ソートが必要 |
ArrayDeque | ソートが不要 |
各実装クラスの特徴一覧
最後に改めて各実装クラスの特徴をまとめておきます。
各インターフェースの特徴は省略しています。
クラス | 特徴 |
---|---|
ArrayList | 要素参照速度が速く、変更速度が遅い |
LinkedList | 要素参照速度が遅く、変更速度が速い |
HashMap | 順序を保持しない |
LinkedHashMap | 挿入順、またはアクセス順を保持 |
TreeMap | 自動順序、または独自実装順序でソート |
HashSet | 順序を保持しない |
LinkedHashSet | 挿入順を保持 |
TreeSet | 自動順序、または独自実装順序でソート |
ArrayDeque | 両端キュー(FIFO・LIFO) |
PriorityQueue | 自動順序、または独自実装順序でソートしたFIFO |
まとめ
Javaのコレクションの一覧の紹介と、自分なりの選び方でした。
正直自分でも使いこなせてないです。
だからこそ、自分なりに改めてまとめてみました。
コレクションを使いこなせれば、本当に世界変わりました(実体験)
自分の中で明確に、「プログラムがわかってきた」と感じれたので、
是非マスターできるようにしてみてはどうでしょうか?
以上、ここまで見ていただきありがとうございます。
皆さまの快適な開発ライフに、ほんの少しでもお役に立てれば幸いです。