Java - Set インターフェースと関連クラス

Set インターフェース

Set インターフェースは単一データを保存する Collection であり、重複したデータの保存を許可せず、順序は保証されない。Set で新しく宣言されたメソッドはない。Set インターフェースを実装した下位クラスには TreeSetHashSet がある。

  • Set
    • SortedSet
      • TreeSet
    • HashSet

SortedSet インターフェース

Set インターフェースを継承したインターフェースには SortedSet インターフェースがあり、SortedSet インターフェースでは昇順にソートしてデータを保管できる。

SortedSet メソッド

メソッド 説明
Comparator<? super E> comparator() SortedSet に設定された Comparator(比較器)を返す。設定された Comparator がなければ null を返す。
E first() SortedSet の最初のオブジェクトを返す。
SortedSet<E> headSet(E toElement) toElement オブジェクトより小さいオブジェクトで構成された SortedSet オブジェクトを返す。
E last() SortedSet の最後のオブジェクトを返す。
SortedSet<E> subSet(E fromElement, E toElement) fromElement(含む)以上で、toElement(含まない)より小さいオブジェクトで構成された SortedSet オブジェクトを返す。
SortedSet<E> tailSet(E fromElement) fromElement(含む)以上のオブジェクトで構成された SortedSet を返す。

HashSet クラス

HashSetAbstractSet を拡張し、Set インターフェースを実装する。ストレージにハッシュテーブルを使用する Collection を作成する。

ハッシュテーブルは、ハッシュ化(Hashing)という仕組みを使用して情報を保存する。ハッシュテーブルのストレージは、データを保存するために一意に区別される key 値と value を 1 つのセットとして保存する。このとき key 値は開発者が付与するものではなく、コード内で自動的に処理される。保存されたデータを順次管理するのではなく hash code で区別して保存するため、index を利用して key 値にアクセスすることはできない。ハッシュ化では、ハッシュコードという固有の値を決定するためにキーの情報内容が使用される。ハッシュ化を利用すると、データを順次管理する場合よりも、大量のデータを管理するときの追加、削除、検索などの速度が向上する。

HashSet はソート機能をサポートしないため、ソート機能を使用するには SortedSet を実装した TreeSet クラスを使用しよう。

HashSet の例

package com.devkuma.tutorial.java.util;

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

public class HashSetClass {

    public static void main(String[] args) {

        Set<Integer> hs = new HashSet<Integer>();

        hs.add(85);
        hs.add(67);
        hs.add(58);
        hs.add(30);
        hs.add(46);

        for (Integer i : hs) {
            System.out.println(i);
        }
    }
}

実行結果は次のとおりである。

67
85
58
30
46

TreeSet クラス

TreeSet は Set インターフェースと SortedSet インターフェースを実装したクラスである。ソート機能をサポートし、ツリー形式でデータを管理する。要素が保存されるときに昇順にソートされて保存されるため、データを取得する速度が落ちるわけではない。

TreeSet の例

package com.devkuma.tutorial.java.util;

import java.util.Set;
import java.util.TreeSet;

public class TreeSetClass {

    public static void main(String[] args) {

        Set<Integer> ts = new TreeSet<Integer>();

        ts.add(85);
        ts.add(67);
        ts.add(58);
        ts.add(30);
        ts.add(46);

        for (Integer i : ts) {
            System.out.println(i);
        }
    }
}

実行結果は次のとおりである。

30
46
58
67
85

前の HashSet クラスとは異なり、保存されたデータをソートしてから出力する。