Set: 重複なしの集合

重複を自動排除。HashSet, TreeSet, LinkedHashSet。

Set
重複なしの集合。
HashSet
O(1) で高速。順序なし。
TreeSet
ソート済み。O(log n)。
VIP Guest List

Setは「VIPゲストリスト」。 同じ人は1回しか登録できない。 2回名前を言っても、無視されるだけ。

Set

HashSet Basics
import java.util.HashSet;
import java.util.Set;
// HashSet の作成
Set<String> fruits = new HashSet<>();
// 要素の追加
fruits.add("Apple");
fruits.add("Banana");
fruits.add("Apple"); // 重複は無視
// サイズ
System.out.println(fruits.size()); // 2
// 存在チェック
if (fruits.contains("Apple")) {
System.out.println("Apple exists");
}
// 削除
fruits.remove("Banana");
// ループ
for (String fruit : fruits) {
System.out.println(fruit);
}
実行結果
2\nApple exists\nApple
Bad
// ❌ Bad: List で重複チェック (O(n))
List<String> list = new ArrayList<>();
if (!list.contains(item)) {
list.add(item); // 遅い
}
Good
// ✅ Good: Set で自動重複排除 (O(1))
Set<String> set = new HashSet<>();
set.add(item); // 重複は自動で無視

パターン

LinkedHashSet, TreeSet, Operations
// LinkedHashSet: 挿入順序を保持
Set<String> ordered = new LinkedHashSet<>();
ordered.add("C");
ordered.add("A");
ordered.add("B");
// 出力: C, A, B(挿入順)
// TreeSet: ソート済み
Set<String> sorted = new TreeSet<>();
sorted.add("C");
sorted.add("A");
sorted.add("B");
// 出力: A, B, C(ソート順)
// 集合演算
Set<Integer> a = Set.of(1, 2, 3);
Set<Integer> b = Set.of(2, 3, 4);
// 和集合
Set<Integer> union = new HashSet<>(a);
union.addAll(b); // {1, 2, 3, 4}
// 積集合
Set<Integer> intersection = new HashSet<>(a);
intersection.retainAll(b); // {2, 3}
// 差集合
Set<Integer> diff = new HashSet<>(a);
diff.removeAll(b); // {1}
Tip: 順序が必要なら LinkedHashSet、ソートなら TreeSet。

合格ライン

HashSet vs TreeSet の違いを説明できる
集合演算ができる

参考リンク

演習課題

課題1: HashSet 操作
HashSet で重複を除去してください。
課題2: 集合演算
2つの Set で和集合・積集合を求めてください。

次のステップ