Java 逆引き集 | HashSet の特性と重複排除 — 一意性保持

Java Java
スポンサーリンク

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] (順序は保証されない)
    }
}
Java

2. 存在確認

System.out.println(set.contains("Banana")); // true
System.out.println(set.contains("Orange")); // false
Java

3. 削除

set.remove("Cherry");
System.out.println(set); // [Banana, Apple]
Java

4. ループ処理

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(ソート順保持)を検討。
  • キーの設計: equalshashCode を正しく実装したクラスを要素に使う。
  • スレッド安全: 複数スレッドで使う場合は Collections.synchronizedSetConcurrentHashMap.newKeySet() を利用。

まとめ

  • HashSet は「重複を許さない集合」。
  • 検索・追加・削除が高速。
  • 順序は保証されないが、一意性保持が簡単にできる。

👉 練習課題として「ユーザーが入力した単語を HashSet に追加し、重複を自動排除する」プログラムを書いてみると、HashSet の便利さが体感できます。

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