Java HashSetとSetの使い方のサンプル

JavaのHashSetクラスの使い方のサンプルです。

目次

仕組み HashSetとは / HashSetの特徴 / HashSetとSetの関係
取得 要素の追加と取得(add、拡張for文、forEach) / 要素を検索(contains)
  中身が空か、要素数を取得(isEmpty/size)
更新 要素を追加(add) / 要素を削除(remove/clear) / セットを連結(addAll)
使用 メソッドの引数と戻り値がセット

HashSetとは

Set<String> color = new HashSet<>();
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

関連の記事

Java ArrayListとListの使い方のサンプル
Java LinkedListの使い方のサンプル

△上に戻る