【Java初心者向け】ListとSetの違いとは?使い分けを実務目線でわかりやすく解説
結論として、Listは「順番を保持して重複を許可するコレクション」、Setは「重複を許可しないコレクション」です。
Javaでプログラムを書くと、複数のデータをまとめて管理する場面が数多くあります。その際によく利用されるのが「List」と「Set」です。どちらも複数の要素を格納できますが、特徴や用途が大きく異なります。
この記事では、IT業務に従事する初心者向けに、ListとSetの違い、実際の業務での使い分け、よくあるミスまで分かりやすく解説します。
ListとSetとは
Listとは
List(リスト)は、要素を追加した順番を保持できるコレクションです。また、同じ値を何度でも格納できます。
例えば次のようなデータを保存できます。
| 追加順 | 値 |
|---|---|
| 1 | りんご |
| 2 | みかん |
| 3 | りんご |
同じ「りんご」が2回登録されている点が特徴です。
Setとは
Set(セット)は、重複する要素を登録できないコレクションです。
同じデータを追加しようとしても、自動的に重複が除外されます。
| 追加した値 | 保存結果 |
|---|---|
| りんご | ○ |
| みかん | ○ |
| りんご | ×(登録されない) |
ListとSetの違い
| 比較項目 | List | Set |
|---|---|---|
| 順番 | 保持する | 実装による |
| 重複 | 可能 | 不可 |
| インデックス | 使用できる | 使用できない |
| 同じ値の登録 | 可能 | 不可 |
| 主な用途 | 一覧表示・履歴管理 | 重複排除・存在チェック |
どんな場面で使われるのか
Listが向いている場面
- 商品一覧
- 検索結果
- 社員一覧
- 注文履歴
- チャット履歴
- ログの保存
表示順が重要なデータは、ほとんどの場合Listを利用します。
Setが向いている場面
- ログイン中ユーザー一覧
- メールアドレスの重複チェック
- 社員番号の管理
- アクセス権限一覧
- タグ情報
同じデータを登録してはいけない場合はSetが適しています。
なぜ重要なのか
コレクションを正しく選択しないと、業務システムで次のような問題が発生します。
- 同じデータが大量に登録される
- 画面表示の順番が変わる
- 検索速度が低下する
- 不要なデータが増える
実務では「とりあえずList」を選ぶ初心者も多いですが、重複を防ぎたい場面ではSetを使うことで、プログラムをシンプルにできます。
初心者が混乱しやすいポイント
Setは必ず順番がバラバラになるわけではない
Setには複数の実装があります。
| 実装クラス | 順番 |
|---|---|
| HashSet | 保持しない |
| LinkedHashSet | 追加順を保持 |
| TreeSet | 並び替えられる |
「Set=順番がない」と覚えるより、「実装によって順番の扱いが異なる」と理解しておくと混乱しません。
Listでも重複チェックはできる
Listでもプログラム側で重複チェックは可能です。
しかし、毎回チェックを書く必要があるため、重複を許可しない設計ならSetを使う方が効率的です。
実際のIT現場での利用例
| 業務 | 利用するコレクション | 理由 |
|---|---|---|
| 注文履歴 | List | 同じ商品を複数回購入できるため |
| 社員番号 | Set | 重複してはいけないため |
| エラーログ | List | 時系列が重要なため |
| 権限一覧 | Set | 同じ権限は不要なため |
| 検索結果 | List | 表示順が重要なため |
筆者が実際に経験した失敗例
運用保守でデータ移行ツールを作成した際、ユーザーIDをListで管理していました。その結果、同じIDが複数回登録され、登録処理が重複実行される不具合が発生しました。
Setへ変更したところ、重複データが自動で除外され、不具合を解消できました。
「重複してはいけないデータ」は最初からSetを選ぶことが重要だと実感した経験です。
業務でよくあるトラブル例
- 社員番号が二重登録される
- 同じメールアドレスへ複数回通知される
- 権限情報が重複して登録される
- 画面に同じデータが何度も表示される
このような問題は、ListとSetの選択を誤ることで発生するケースがあります。
原因の切り分け
| 確認項目 | 確認内容 |
|---|---|
| 使用しているコレクション | ListかSetか確認する |
| 重複チェック | プログラム側で実施しているか |
| データベース | 一意制約が設定されているか |
| 登録処理 | 複数回実行されていないか |
GUIで確認できる内容
- IDEのデバッグ機能
- 変数ビュー
- ウォッチ式
- ブレークポイント
コレクションの中身を確認すると、重複登録や順番の違いを把握できます。
CUI(コマンド)で確認できる内容
Javaアプリケーションの実行時には、ログ出力やデバッグ機能を利用してコレクションの内容を確認できます。
また、ビルドやテストでは次のようなコマンドがよく利用されます。
- mvn test
- gradle test
- java -jar アプリケーション名.jar
確認結果の見方
- 同じデータが複数あるならListの可能性が高い
- 重複が除外されていればSetが利用されている
- 表示順が変わる場合はHashSetを利用している可能性がある
初心者がやりがちなミス
- すべてListで作成する
- Setなのにインデックスで取得しようとする
- 順番が保証されると思い込む
- 重複チェックを二重に実装する
注意点
- Setはインデックスで要素を取得できません。
- HashSetは追加順を保証しません。
- Listは重複を防止しません。
- 要件に応じて適切な実装クラスを選びましょう。
上司へ報告するポイント
- 重複データが発生しているか
- どのコレクションを利用しているか
- 影響範囲
- 発生条件
- 再現手順
- 修正方針
エスカレーションするタイミング
- 本来重複してはいけないデータが登録された場合
- データベースにも重複が保存された場合
- 業務へ影響が出ている場合
- 設計書と実装が異なる場合
応用知識
ListやSetはインターフェースであり、実際には複数の実装クラスがあります。
| インターフェース | 代表的な実装 | 特徴 |
|---|---|---|
| List | ArrayList | 最も利用される実装 |
| List | LinkedList | 要素の追加・削除に強い |
| Set | HashSet | 高速な重複判定 |
| Set | LinkedHashSet | 追加順を保持 |
| Set | TreeSet | 自然順や指定した順序で並べ替え |
関連するIT用語
- Collection
- ArrayList
- LinkedList
- HashSet
- LinkedHashSet
- TreeSet
- Map
- HashMap
- Iterator
よくある質問(FAQ)
ListとArrayListは同じですか?
違います。Listはインターフェース、ArrayListはその代表的な実装クラスです。
Setで順番を保持したい場合はどうしますか?
追加した順番を保持したい場合はLinkedHashSetを利用します。
高速に重複チェックしたい場合はどちらですか?
一般的にはSetの方が重複判定に適しています。
重複を削除したい場合はどうすればよいですか?
Listの内容をSetへ変換すると、重複を取り除けます。ただし、使用するSetの実装によっては要素の順番が変わる場合があるため注意してください。
まとめ
ListとSetはどちらも複数のデータを扱うためのコレクションですが、用途は大きく異なります。
- 順番を保持し、重複を許可するならList
- 重複を許可せず、一意なデータを管理するならSet
- インデックスでアクセスするならList
- 重複排除や存在チェックを重視するならSet
実務では「データに順番が必要か」「同じデータを登録してよいか」を最初に考えることが、適切なコレクション選択につながります。初心者のうちからこの使い分けを意識することで、保守性が高く、不具合の少ないプログラムを書けるようになります。

コメント