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

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

目次

仕組み HashSetクラスとは
  HashSetクラスとSetインターフェースの関係
取得 要素を取得(拡張for文、forEach)
  要素を検索(contains)
  中身が空か、要素数を取得(isEmpty/size)
追加 要素を追加(add)
削除 要素を削除(remove/clear)
連結 セットを連結する(addAll)
使用 メソッドの引数/戻り値がセットの場合

HashSetクラスとは

HashSetクラスの定義

public class HashSet<E>
extends AbstractSet<E> // 継承するクラス
implements Set<E>, Cloneable, Serializable // 実装するインターフェース

使用例

Set a = new HashSet<>();

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

HashSetの特徴

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

package test1;
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 (String a : color) {
			System.out.println(a);//青 赤 黄
		}
		color.forEach(a -> System.out.println(a));//青 赤 黄
		color.forEach(System.out::println);//青 赤 黄
	}
 }

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

要素を検索(contains)

public boolean contains(Object o)

containsメソッドは、指定の値が存在する場合はtrueを、存在しない場合はfalseを返します。

package test1;
import java.util.HashSet;
import java.util.Arrays;
import java.util.Set;

public class Test1 {
	public static void main(String[] args) {
        Set<String> c1 = new HashSet<>(Arrays.asList("赤","黄","青"));

		System.out.println(c1.contains("黄"));//true
		System.out.println(c1.contains("白"));//false
	}
 }

8行目は、セットです。
10,11行目は、containsメソッドで指定の値を検索しています。

中身が空か、要素数を取得(isEmpty/size)

public boolean isEmpty()
public int size()

isEmptyメソッドは、中身が空の場合はtrueを、そうでない場合はfalseを返します。
sizeメソッドは、要素数を返します。

package test1;
import java.util.HashSet;
import java.util.Arrays;
import java.util.Set;

public class Test1 {
	public static void main(String[] args) {
		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
	}
 }

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

要素を追加(add)

public boolean add(E e)
package test1;
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("青");
		System.out.println(color);//[青, 赤, 黄]
	}
 }

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

要素を削除(remove/clear)

public boolean remove(Object o)
public void clear()

removeメソッドは指定の要素を削除します。
clearメソッドはすべての要素を削除します。

package test1;
import java.util.HashSet;
import java.util.Arrays;
import java.util.Set;

public class Test1 {
	public static void main(String[] args) {
		Set<String> c1 = new HashSet<>(Arrays.asList("赤","黄","青"));
		
		c1.remove("黄");
		System.out.println(c1);//[青, 赤]
		c1.clear();
		System.out.println(c1);//[]
	}
 }

10行目は、removeメソッドで指定の要素を削除しています。
12行目は、clearメソッドですべての要素を削除しています。

セットを連結する(addAll)

public boolean addAll(Collection<? extends E> c)

addAllメソッドはセットを連結します。

package test1;
import java.util.HashSet;
import java.util.Arrays;
import java.util.Set;

public class Test1 {
    public static void main(String[] args) {
        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); // [あ, い]
    }
 }

11行目は、addAllメソッドでセットを連結しています。

メソッドの引数/戻り値がセットの場合

package test1;
import java.util.HashSet;
import java.util.Arrays;
import java.util.Set;

public class Test1 {
	public static void main(String[] args) {
		Set<String> color = new HashSet<>(Arrays.asList("赤","黄"));

        Set<String> b = showResult(color);
    }
    private static Set<String> showResult(Set<String> c1) {
        return c1;
	}
 }

10行目は、呼び出し元のメソッドです。引数(実引数)にセットを指定しています。戻り値もセットです。
12行目は、定義されたメソッドです。引数(仮引数)にセットがあります。戻り値もセットです。

・「showResult(Set<String> c1」のSet<String> c1が引数の型と変数です。
・「private static Set<String>」のSet<String>が戻り値の型です。

呼び出し元のメソッドの引数の変数名(color)と定義されたメソッドの引数の変数名(c1)は異なっていても使用できます。

関連の記事

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

△上に戻る