Java HashSet クラス:初心者のガイド

はじめに

こんにちは、未来のJava開発者たち!今日は、Javaの素晴らしい世界であるHashSetについて深く掘り下げていきます。プログラミングが初めての方でも心配しないでください。私がこれまで教えた無数の学生たちにも同じように、一歩一歩お手本に导いていきます。HashSetを、ユニークなアイテムを保存できる魔法の箱だと思ってください。重複は許されません!それは、各種の靴を一つずつ入れられる特別な引き出しのようです。では始めましょう!

Java - HashSet

クラス宣言

Javaでは、HashSetはJava Collections Frameworkの一部です。それを使用するには、まずインポートする必要があります。

import java.util.HashSet;

HashSetの基本的な宣言は以下のようになります:

HashSet<E> hs = new HashSet<E>();

ここで、'E'はHashSetに保存したい要素の型の占位符です。例えば、文字列を保存したい場合:

HashSet<String> fruitBasket = new HashSet<String>();

パラメータ

HashSetを作成する際、2つのオプションのパラメータを指定することができます:

  1. 初期キャパシティ:HashSetが要素を保存するために使用する"バケツ"の数。
  2. 負荷係数:HashSetが自動的にサイズが拡大されるまでの満杯度の測定。

今はこれらについて深く考えなくても構いません。それらは、魔法の箱の高度な設定と思ってください!

クラスコンストラクタ

HashSetは4つのコンストラクタを提供します。それぞれを見ていきましょう:

// コンストラクタ1:デフォルトの初期キャパシティ(16)と負荷係数(0.75)で空のHashSetを作成
HashSet<String> set1 = new HashSet<>();

// コンストラクタ2:指定されたコレクションの要素を含むHashSetを作成
Collection<String> collection = Arrays.asList("Apple", "Banana", "Cherry");
HashSet<String> set2 = new HashSet<>(collection);

// コンストラクタ3:指定された初期キャパシティとデフォルトの負荷係数(0.75)で空のHashSetを作成
HashSet<String> set3 = new HashSet<>(20);

// コンストラクタ4:指定された初期キャパシティと負荷係数で空のHashSetを作成
HashSet<String> set4 = new HashSet<>(20, 0.8f);

クラスメソッド

以下は、最も一般的に使用されるHashSetメソッドの一覧です:

メソッド 説明
add(E e) このセットに指定された要素がまだ存在しない場合、その要素をこのセットに追加
clear() このセットからすべての要素を削除
contains(Object o) このセットに指定された要素が存在する場合はtrueを返す
isEmpty() このセットに要素がない場合はtrueを返す
remove(Object o) このセットに指定された要素が存在する場合、その要素をこのセットから削除
size() このセットにある要素の数を返す

継承されたメソッド

HashSetは親クラスからメソッドを継承します。注目すべきものには以下の通りです:

  • Setから:addAll(), containsAll(), equals(), hashCode(), removeAll(), retainAll()
  • Collectionから:iterator(), toArray()
  • Objectから:clone(), finalize(), getClass(), notify(), notifyAll(), wait()

HashSetに要素を追加する例

さあ、知識を実践して楽しい例を見ていきましょう。アイスクリーム店でユニークなアイスクリームのフレーバーを管理するプログラムを作成していると想象してください:

import java.util.HashSet;

public class IceCreamShop {
public static void main(String[] args) {
// アイスクリームのフレーバーを保存する新しいHashSetを作成
HashSet<String> flavors = new HashSet<>();

// いくつかのフレーバーを追加
flavors.add("バニラ");
flavors.add("チョコレート");
flavors.add("ストロベリー");
flavors.add("ミントチップ");

// デュプリケートを追加しようとする
boolean added = flavors.add("バニラ");

System.out.println("バニラを再度追加? " + added);
System.out.println("私たちのアイスクリームのフレーバー:" + flavors);
System.out.println("私たちには " + flavors.size() + " 種類のユニークなフレーバーがあります!");

// 特定のフレーバーをお持ちしているか確認
String searchFlavor = "ロッキーロード";
if (flavors.contains(searchFlavor)) {
System.out.println("はい、私たちには " + searchFlavor + " があります!");
} else {
System.out.println(searchFlavor + " はおりません。");
}

// フレーバーを削除
flavors.remove("ストロベリー");
System.out.println("ストロベリーを削除した後の更新されたフレーバー:" + flavors);
}
}

出力

このプログラムを実行すると、以下のような出力が表示されます:

バニラを再度追加? false
私たちのアイスクリームのフレーバー:[バニラ, ミントチップ, チョコレート, ストロベリー]
私たちには 4 種類のユニークなフレーバーがあります!
ロッキーロードはおりません。
ストロベリーを削除した後の更新されたフレーバー:[バニラ, ミントチップ, チョコレート]

何が起こったかを分解してみましょう:

  1. アイスクリームのフレーバーを保存するためのHashSetを flavors として作成しました。
  2. バニラ、チョコレート、ストロベリー、ミントチップの4つのフレーバーを追加しました。
  3. バニラを再度追加しようとしましたが、HashSetは重複を許さないため add()false を返しました。
  4. 全てのフレーバーを印刷しました。追加した順序とは異なるかもしれないことに注意してください - HashSetは挿入順序を保持しません。
  5. contains() を使用してロッキーロードフレーバーをお持ちしているか確認しました。おらず、その結果 "おりません" メッセージを印刷しました。
  6. 最後に、ストロベリーを削除し、更新されたフレーバーのセットを印刷しました。

それでおしまい!初めてのHashSetを作成し、その主要なメソッドのいくつかを使用しました。覚えておきましょう、HashSetはユニークな要素を保存する必要があり、順序が気にしない場合に非常に役立ちます。それは、それぞれ異なる色のビー玉を持つ袋のようなもので、特定の色を持っているかどうかは簡単に確認できますが、袋をひっくり返してビー玉が出てくる順序を制御できないのと同じです。

Javaの旅を続ける中で、HashSetは多くの状況で非常に便利に使えることがわかります。まいりました、すぐにHashSetのプロになるでしょう!幸せなコーディング!

Credits: Image by storyset