HashSet の特性と重複排除 — 一意性保持
Java の HashSet は「重複を許さない集合」を表すクラスです。初心者が理解すべきポイントは「一意性保持」「順序が保証されない」「検索が速い」ということです。ここでは例題を交えて解説します。
HashSet の特徴
- 重複要素を保持しない: 同じ値を追加しても無視される。
- 順序は保証されない: 挿入順やソート順は保持されない。
- 内部構造:
HashMapをベースにしている。 - 検索性能: 平均 O(1) で存在確認ができる。
- 用途: 「一意な値を集めたい」「重複を排除したい」場面に最適。
基本コード例
1. 作成と追加
import java.util.HashSet;
public class HashSetDemo {
public static void main(String[] args) {
HashSet<String> set = new HashSet<>();
set.add("Apple");
set.add("Banana");
set.add("Cherry");
set.add("Apple"); // 重複 → 無視される
System.out.println(set); // [Banana, Cherry, Apple] (順序は保証されない)
}
}
Java2. 存在確認
System.out.println(set.contains("Banana")); // true
System.out.println(set.contains("Orange")); // false
Java3. 削除
set.remove("Cherry");
System.out.println(set); // [Banana, Apple]
Java4. ループ処理
for (String fruit : set) {
System.out.println(fruit);
}
Java👉 順序は保証されないので、出力順は毎回異なる可能性がある。
性能の考え方
| 操作 | 計算量 | 特徴 |
|---|---|---|
| add(value) | 平均 O(1) | 重複は自動排除 |
| contains(value) | 平均 O(1) | 高速検索 |
| remove(value) | 平均 O(1) | 高速削除 |
| 走査 | O(n) | 順序は保証されない |
👉 大量データでも高速に重複排除できる。
例題で練習
例題1: 名前リストから重複排除
String[] names = {"Tanaka", "Sato", "Suzuki", "Tanaka", "Sato"};
HashSet<String> uniqueNames = new HashSet<>();
for (String n : names) {
uniqueNames.add(n);
}
System.out.println(uniqueNames); // [Tanaka, Sato, Suzuki]
Java👉 配列やリストから重複を簡単に取り除ける。
例題2: 出現チェック
HashSet<Integer> seen = new HashSet<>();
int[] numbers = {1, 2, 3, 2, 4, 1};
for (int n : numbers) {
if (seen.contains(n)) {
System.out.println("重複: " + n);
} else {
seen.add(n);
}
}
Java👉 「すでに出たかどうか」を高速に判定できる。
テンプレート集
作成
HashSet<Type> set = new HashSet<>();
Java追加
set.add(value);
Java存在確認
set.contains(value);
Java削除
set.remove(value);
Javaサイズ
set.size();
Java実務でのコツ
- 重複排除: リストや配列からユニーク要素を抽出するのに便利。
- 順序が必要なら:
LinkedHashSet(挿入順保持)、TreeSet(ソート順保持)を検討。 - キーの設計:
equalsとhashCodeを正しく実装したクラスを要素に使う。 - スレッド安全: 複数スレッドで使う場合は
Collections.synchronizedSetやConcurrentHashMap.newKeySet()を利用。
まとめ
- HashSet は「重複を許さない集合」。
- 検索・追加・削除が高速。
- 順序は保証されないが、一意性保持が簡単にできる。
👉 練習課題として「ユーザーが入力した単語を HashSet に追加し、重複を自動排除する」プログラムを書いてみると、HashSet の便利さが体感できます。
