Java 逆引き集 | List / Map / Set の基本概念(インターフェース) - データ構造選択

Java Java
スポンサーリンク

コレクションの全体イメージ(「データをどう持つか」を決める)

Javaの List / Map / Set は、「データをどう集めて、どう取り出すか」を決めるための基本的な“器”です。 どれも「インターフェース」として定義されていて、実際には ArrayListHashMapHashSet などの実装クラスを使いますが、まずは「List はこういう考え方」「Map はこう」「Set はこう」という“概念”を掴むことが大事です。

ざっくり言うと、 List=順番付きの「並び」 Map=キーと値の「辞書」 Set=重複なしの「集合」 というイメージです。

List の基本概念(順番付きの「並び」)

List とは何か

List は「順番を持った要素の並び」を表すインターフェースです。 「1件目」「2件目」「3件目」といったインデックスでアクセスでき、同じ値を何度入れても構いません。

import java.util.ArrayList;
import java.util.List;

public class ListBasicExample {
    public static void main(String[] args) {
        List<String> names = new ArrayList<>();

        names.add("Taro");
        names.add("Hanako");
        names.add("Taro"); // 重複OK

        System.out.println(names.get(0)); // Taro
        System.out.println(names.get(1)); // Hanako
        System.out.println(names.get(2)); // Taro
    }
}
Java

「順番が意味を持つデータ」「同じものが複数あってもいいデータ」を扱うときに向いています。

List を選ぶ場面のイメージ

例えば「注文履歴」「メッセージ一覧」「検索結果のリスト」など、 「先頭から順番に処理したい」「何件目かを意識したい」場面では、まず List を思い浮かべると自然です。

for (String name : names) {
    System.out.println("名前: " + name);
}
Java

「順番」「重複OK」「インデックスアクセス」という3つが、List の性格だと思っておくと選びやすくなります。

Map の基本概念(キーと値の「辞書」)

Map とは何か

Map は「キーと値のペア」を集めたインターフェースです。 キーを使って値を取り出す、いわば「辞書」や「連想配列」のような構造です。

import java.util.HashMap;
import java.util.Map;

public class MapBasicExample {
    public static void main(String[] args) {
        Map<String, Integer> ages = new HashMap<>();

        ages.put("Taro", 20);
        ages.put("Hanako", 25);

        System.out.println(ages.get("Taro"));   // 20
        System.out.println(ages.get("Hanako")); // 25
    }
}
Java

同じキーをもう一度 put すると、値が上書きされます。

ages.put("Taro", 30); // Taro の年齢を更新
System.out.println(ages.get("Taro")); // 30
Java

「キーで一意に識別されるデータ」を扱うときに向いています。

Map を選ぶ場面のイメージ

例えば「ユーザーID→ユーザー情報」「商品コード→価格」「設定名→設定値」など、 「何かのキーから素早く値を引きたい」場面では、Map がぴったりです。

for (String key : ages.keySet()) {
    Integer age = ages.get(key);
    System.out.println(key + " の年齢: " + age);
}
Java

「キーで探す」「キーは重複なし」「値は上書きされうる」という性格を持っている、と覚えておくと使いどころが見えてきます。

Set の基本概念(重複なしの「集合」)

Set とは何か

Set は「重複を許さない要素の集合」を表すインターフェースです。 同じ値を何度追加しても、1つとして扱われます。

import java.util.HashSet;
import java.util.Set;

public class SetBasicExample {
    public static void main(String[] args) {
        Set<String> tags = new HashSet<>();

        tags.add("java");
        tags.add("backend");
        tags.add("java"); // 重複は無視される

        System.out.println(tags.size()); // 2
    }
}
Java

「あるかないか」「ユニークな値の集まり」を扱うときに向いています。

Set を選ぶ場面のイメージ

例えば「重複を排除したカテゴリ一覧」「アクセスしたユーザーの集合」「権限の種類」など、 「同じものが2回入っても意味がない」場面では、Set が自然な選択になります。

for (String tag : tags) {
    System.out.println("タグ: " + tag);
}
Java

「順番はあまり重要ではない」「重複なし」「存在チェックが主役」という性格が、Set の特徴です。

インターフェースとしての List / Map / Set を意識する

実装クラスより「概念」を先に考える

Java では、List / Map / Set はインターフェースで、 実際には ArrayList / LinkedListHashMap / TreeMapHashSet / LinkedHashSet などのクラスを使います。

初心者のうちは、「まずインターフェースで考える」癖をつけるといいです。

List が欲しい → とりあえず ArrayList Map が欲しい → とりあえず HashMap Set が欲しい → とりあえず HashSet

という感じで、「どの器がふさわしいか」を先に決めてから、 「その器をどの実装クラスで作るか」を後で選ぶイメージです。

メソッドの引数・戻り値はインターフェースで書く

再利用しやすいコードにしたいなら、メソッドの引数や戻り値はインターフェース型で書くのが基本です。

public void printNames(List<String> names) {
    for (String name : names) {
        System.out.println(name);
    }
}
Java

呼び出し側は ArrayList でも LinkedList でも渡せます。

List<String> names = new ArrayList<>();
names.add("Taro");
names.add("Hanako");

printNames(names);
Java

「中身の構造(List / Map / Set)だけを約束し、具体的な実装は呼び出し側に任せる」という設計ができると、 API の柔軟性が一気に上がります。

データ構造選択のざっくりした判断基準

順番が大事で、重複もありうる → List キーから値を引きたい、一意な識別子がある → Map 重複を排除したい、あるかないかが大事 → Set

迷ったときは、「このデータをどう扱いたいか」を言葉にしてみるといいです。 「順番に処理したいのか」「キーで探したいのか」「重複をなくしたいのか」。

その答えに一番近いインターフェースを選ぶ、という感覚で List / Map / Set を使い分けられるようになると、 データ構造選択が“勘”ではなく“意図”でできるようになっていきます。

タイトルとURLをコピーしました