JavaのHashSetクラスの使い方のサンプルです。
目次
仕組み | HashSetとは / HashSetの特徴 / HashSetとSetの関係 |
取得 | 要素の追加と取得(add、拡張for文、forEach) / 要素を検索(contains) |
中身が空か、要素数を取得(isEmpty/size) | |
更新 | 要素を追加(add) / 要素を削除(remove/clear) / セットを連結(addAll) |
使用 | メソッドの引数と戻り値がセット |
HashSetとは
Set<String> color color.add("赤"); color.add("青"); |
1つの変数で複数の値を保持できます。
上記はHashSetクラスをインスタンス化してSetインターフェイス型の変数に代入しています。
この変数colorは複数の値(赤と青)を持てるようになります。
<>はジェネリクスです。変数colorの各値はStringのみセット可能です。
HashSetの特徴
HashSetの変数のイメージ
要素
各項目を要素(element)といいます。
1つの変数で複数の値を保持できます。
値は、StringやIntegerなどの参照型です。int等の基本型は使用できません。
addメソッドで同じ値を登録しようとした場合は、エラーになりませんが登録されません。
要素の追加や検索は速いです。
その他
順序は保証されていません。
スレッドセーフではありません。
以下はOracleのJava8 API仕様のHashSetクラスのリンクです。
https://docs.oracle.com/javase/jp/8/docs/api/java/util/HashSet.html
要素の追加と取得(add、拡張for文、forEach)
addは値を追加します。
for文とforEachは要素を順に取得します。
import java.util.HashSet;
import java.util.Set;
public class Test1 {
public static void main(String[] args) {
Set<String> color = new HashSet<>();
color.add("赤"); // 追加
color.add("黄");
color.add("青");
// 拡張for文 (加算(i++)の表記なし)
for (String a : color) {
System.out.println(a);// 青 赤 黄
}
// forEach (変数a以降はラムダ式)
color.forEach(a -> System.out.println(a));// 青 赤 黄
// forEach (System.out::printlnはメソッド参照)
color.forEach(System.out::println);// 青 赤 黄
}
}
要素を検索(contains)
public boolean contains(Object o) |
containsメソッドは、指定の値が存在する場合はtrueを、存在しない場合はfalseを返します。
Set<String> c1 = new HashSet<>(Arrays.asList("赤","黄","青"));
System.out.println(c1.contains("黄"));//true (存在する)
System.out.println(c1.contains("白"));//false (存在しない)
中身が空か、要素数を取得(isEmpty/size)
public boolean isEmpty() |
public int size() |
isEmptyメソッドは、中身が空の場合はtrueを、そうでない場合はfalseを返します。
sizeメソッドは、要素数を返します。
Set<String> c1 = new HashSet<>(Arrays.asList("赤","黄","青"));
System.out.println(c1.isEmpty());//false (中身あり)
System.out.println(c1.size());//3 (要素数を表示)
c1.clear(); // すべての要素を削除
System.out.println(c1.isEmpty());//true (中身なし)
System.out.println(c1.size()); //0 (要素数を表示)
要素を追加(add)
public boolean add(E e) |
addメソッドは要素を追加します。
Set<String> color = new HashSet<>();
color.add("赤");
color.add("黄");
color.add("青");
System.out.println(color);//[青, 赤, 黄]
要素を削除(remove/clear)
public boolean remove(Object o) |
public void clear() |
removeメソッドは指定の要素を削除します。
clearメソッドはすべての要素を削除します。
Set<String> c1 = new HashSet<>(Arrays.asList("赤","黄","青"));
c1.remove("黄"); // 指定の要素を削除
System.out.println(c1);//[青, 赤]
c1.clear(); // すべての要素を削除
System.out.println(c1);//[]
セットを連結(addAll)
public boolean addAll(Collection<? extends E> c) |
addAllメソッドはセットを連結します。
Set<String> a1 = new HashSet<>(Arrays.asList("a","b"));
Set<String> b1 = new HashSet<>(Arrays.asList("あ","い"));
a1.addAll(b1); // セットを連結
System.out.println(a1); // [a, b, あ, い]
System.out.println(b1); // [あ, い]
メソッドの引数/戻り値がセット
Set<String> color = new HashSet<>(Arrays.asList("赤","黄"));
Set<String> b = showResult(color); // 呼び出し元(引数と戻り値はセット)
private static Set<String> showResult(Set<String> c1) { // (呼び出し先)
return c1;
}
2行目は、呼び出し元のメソッドです。引数(実引数)にセットを指定しています。戻り値もセットです。
4行目は、定義されたメソッドです。引数(仮引数)にセットがあります。戻り値もセットです。
・「showResult(Set<String> c1」のSet<String> c1が引数の型と変数です。
・「private static Set<String>」のSet<String>が戻り値の型です。
呼び出し元のメソッドの引数の変数名(color)と定義されたメソッドの引数の変数名(c1)は異なっていても使用できます。
HashSetとSetの関係
public class HashSet<E> extends AbstractSet<E> implements Set<E>, Cloneable, Serializable |
HashSetクラスはSetインターフェースを実装しています。
使用例
Set a = new HashSet<>(); |
HashSetクラスをインスタンス化する時、HashSetクラス独自のメソッドを使用しない限り、Setインターフェイス型の変数に代入することが多いです。
Setインターフェイスにあるメソッドを使用できます。
以下はOracleのJava8 API仕様のSetインターフェースのリンクです。
https://docs.oracle.com/javase/jp/8/docs/api/java/util/Set.html
関連の記事