2026年1月18日日曜日

【Java】List, Set, Mapはどう選ぶ?Collectionフレームワークの使い分けと性能の正体

1. 導入:データを入れる「器」を間違えるとどうなるか?


「とりあえず ArrayList に入れて、重複チェックを for文で回す……」

そのコード、データが10万件になっても大丈夫ですか?

Javaの Collection には多くのクラスがありますが、それぞれに「得意な仕事」と「苦手な動作」があります。


2. 主要3派閥のキャラクターを知る


まずは、インターフェースごとの「性格」を整理します。

  • List(並び順が大事): 出席簿。入れた順番を保持し、インデックス(番号)で指定できる。

  • Set(重複は許さない): パーティーの招待客リスト。同じ人は二人いらない。順序は気にしない。

  • Map(ペアで管理): 下駄箱の番号と靴。キー(番号)を指定すれば、中身(靴)が一瞬で取り出せる。



3. 【徹底比較】速度と制限のトレードオフ


クラス名重複順序検索速度特徴・使い道
ArrayList許す保持遅い(O(n))最も汎用。 最後尾への追加は速いが、検索は端から探すので遅い。
HashSet禁止なし爆速(O(1))重複を自動で消したい時。検索が非常に速い。
TreeSet禁止ソート普通(O(log n))常に中身を並び替えておきたい時。
HashMapキー禁止なし爆速(O(1))IDから名前を引くような、紐付け管理の王者。


4. 納得ポイント:なぜ Set の検索は速いのか?


ArrayList は、100万人の中から一人を探すのに、最悪100万人全員を確認します。

対して HashSet は、**「ハッシュ値」**という整理番号を使って、一瞬でターゲットが居そうな場所を特定します。

「データ量が増えても検索時間がほぼ変わらない」という事実に、データ構造の凄さを納得しました。


5. 「null」の扱いと注意点


  • ArrayListnull を入れられる。

  • TreeMap や TreeSet はソートを行うため、null を入れると NullPointerException で落ちる。

    「器を選ぶ段階で、nullを許容するかどうかの設計が始まっている」という視点を提示します。


6. まとめ:器選びのフローチャート


  1. 重複を許すか? → Yesなら List

  2. 一意(ユニーク)にしたいか? → Yesなら Set

  3. キーと値をセットにしたいか? → Yesなら Map

  4. 常にソートが必要か? → Yesなら Tree 系のクラス



0 件のコメント:

コメントを投稿

【Java】List, Set, Mapはどう選ぶ?Collectionフレームワークの使い分けと性能の正体

1. 導入:データを入れる「器」を間違えるとどうなるか? 「とりあえず ArrayList に入れて、重複チェックを for文で回す……」 そのコード、データが10万件になっても大丈夫ですか? Javaの Collection には多くのクラスがありますが、それぞれに「得意な仕事...