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

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

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

HashSetとは

使用例

Set a = new HashSet<>();

上記はHashSetクラスをインスタンス化してSetインターフェイス型の変数に代入しています。
この変数aは複数の値を持てるようになります。

HashSetの特徴

項目 説明
HashSetの
変数のイメージ
要素 各項目を要素(element)といいます。
1つの変数で複数の値を保持できます。
値は、StringやIntegerなどの参照型です。int等の基本型は使用できません。
値の順序 順序は保証されていません。
値の重複 addメソッドで同じ値を登録しようとした場合は、エラーになりませんが登録されません。
速さ 要素の追加や検索は速いです。
スレッドセーフ スレッドセーフではありません。
導入時期 バージョン1.2で導入されました。

以下はOracleのJava8 API仕様のHashSetクラスのリンクです。
https://docs.oracle.com/javase/jp/8/docs/api/java/util/HashSet.html

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

 

要素を取得(拡張for文、forEach)

ループで要素を順に取得します。

  Set<String> color = new HashSet<>();
  color.add("赤");
  color.add("黄");
  color.add("青");
		
  // 拡張for文
  for (String a : color) {
    System.out.println(a);//青 赤 黄
  }
		
  // forEachとラムダ式
  color.forEach(a -> System.out.println(a));//青 赤 黄
		
  // forEachとメソッド参照
  color.forEach(System.out::println);//青 赤 黄

7行目は、拡張for文ですべての要素を取得しています。
12行目は、forEachメソッドでセットの各値を取得しています。変数a以降はラムダ式です。
15行目のSystem.out::printlnは、メソッド参照です。
forEachメソッドは、Java8で導入されました。

要素を検索(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

3行目は、isEmptyメソッドで中身が空か取得しています。
4行目は、sizeメソッドで要素数を取得しています。
5行目は、clearメソッドですべての要素を削除しています。

要素を追加(add)

public boolean add(E e)
  Set<String> color = new HashSet<>();
		
  color.add("赤");
  color.add("黄");
  color.add("青");
  System.out.println(color);//[青, 赤, 黄]

3行目は、addメソッドで要素を追加しています。

要素を削除(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)は異なっていても使用できます。

関連の記事

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

△上に戻る