Java開発では、List・Map・Set の3種類のコレクションを正しく使い分けることが、
可読性・性能・バグ防止に大きく影響します。
しかし、「どれを使えばいいのか?」
「違いが分かりにくい」
と感じる人も多いはず。
この記事では、Javaの主要コレクションを最速で判断できるように整理しました。
1. List / Map / Set の違いを一言でまとめると?
| コレクション | 重複 | 順序 | 主な用途 |
|---|---|---|---|
| List | あり | 保持する(順序が重要) | 順番通りに複数のデータを扱う |
| Set | なし(ユニーク) | 基本なし | 重複排除/存在チェックを高速化 |
| Map | Key はユニーク | Key の順序なし | キーと値のペア管理(辞書型) |
2. List(リスト)とは?
■ 特徴
-
順序を保持
-
重複を許可
-
インデックスでアクセス可能(
list.get(0))
■ 主な実装クラス
| 実装 | 特徴 |
|---|---|
| ArrayList | 均等なアクセスが高速。最も使用頻度が高い |
| LinkedList | 追加・削除が多い場合に有利 |
| CopyOnWriteArrayList | スレッドセーフ。読み取りが圧倒的に多い時 |
■ サンプルコード
■ List が向いている用途
-
順序通りに表示したい
-
重複も許容したい(ログ、履歴、検索結果)
-
数字の index でアクセスしたい
3. Set(セット)とは?
■ 特徴
-
重複を許可しない
-
順序なし
-
存在確認が高速(内部でハッシュを使用)
■ 主な実装クラス
| 実装 | 特徴 |
|---|---|
| HashSet | 高速(最もよく使う) |
| LinkedHashSet | 追加順序を保持 |
| TreeSet | 自然順序(ソート)で保持 |
■ サンプルコード
■ Set が向いている用途
-
重複排除(メールアドレス一覧、IDリスト)
-
存在チェックを高速化したい
-
順序は不要
4. Map(マップ)とは?
■ 特徴
-
Key と Value の組み合わせ
-
Key はユニーク(重複不可)
-
値は重複OK
-
辞書・連想配列として利用
■ 主な実装クラス
| 実装 | 特徴 |
|---|---|
| HashMap | 最も高速で一般的 |
| LinkedHashMap | 追加順序を保持 |
| TreeMap | Key をソートして保存 |
| ConcurrentHashMap | スレッドセーフで高速 |
■ サンプルコード
■ Map が向いている用途
-
キー(コード、ID、文字列)で検索したい
-
キーと値のペアを保持したい
-
ルックアップ(高速検索)が必要
5. List / Set / Map の性能比較
| 処理内容 | List(ArrayList) | Set(HashSet) | Map(HashMap) |
|---|---|---|---|
| 追加 | 普通 | とても速い | とても速い |
| 検索 | 遅い(線形探索) | 速い(ハッシュ) | 速い(Key検索) |
| 重複管理 | 手動で実施 | 自動で排除 | Key をユニークに管理 |
6. よくある用途別おすすめ
✔ データを順番通りに並べたい
→ List
✔ 重複を排除したい
→ Set
✔ 検索を高速化したい
→ Set / Map
✔ キーと値で管理したい
→ Map
✔ ID → オブジェクト を高速アクセスしたい
✔ 「存在するか?」を高速で判定したい
7. 実務での使い分けフローチャート
8. List・Set・Map の注意点(実務でよくあるミス)
■ equals() と hashCode() を正しく実装していない
Set や Map のキーにオブジェクトを使うなら必須。
■ LinkedList を無闇に使う
ほとんどの場合 ArrayList の方が速い。
■ Map のループ時に entrySet を使わない
これは性能に影響する典型的な間違い。
9. まとめ:迷ったらこのルールでOK
-
順序 + 重複 → List
-
重複なし → Set
-
キーと値 → Map
-
検索性能が必要 → Set / Map(Hash 系)
-
並列処理 → CopyOnWriteArrayList / ConcurrentHashMap
これだけ覚えておけば、実務の 90% は対応できます。
