Java - Set インターフェースと関連クラス
Set インターフェース
Set インターフェースは単一データを保存する Collection であり、重複したデータの保存を許可せず、順序は保証されない。Set で新しく宣言されたメソッドはない。Set インターフェースを実装した下位クラスには TreeSet、HashSet がある。
- Set
- SortedSet
- TreeSet
- HashSet
- SortedSet
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 クラス
HashSet は AbstractSet を拡張し、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 クラスとは異なり、保存されたデータをソートしてから出力する。