JavaにおけるHashSetの重要性とは?ハッシュによるデータ操作の基本を解説
JavaのHashSetは、ハッシュ(Hashing)の仕組みを利用してデータを管理するコレクションクラスです。要素の追加・検索・削除を高速に行えるのが最大の特徴で、重複しないデータの集合を扱う場面で非常に重要な役割を果たします。ここでは、実際のコード例を通じてHashSetの動作を確認してみましょう。
サンプルコード
import java.util.*;
public class Demo{
private final String f_str, l_str;
public Demo(String f_str, String l_str){
this.f_str = f_str;
this.l_str = l_str;
}
public boolean equals(Object o){
if (o instanceof Demo)
return true;
Demo n = (Demo)o;
return n.f_str.equals(f_str) && n.l_str.equals(l_str);
}
public static void main(String[] args){
Set<Demo> my_set = new HashSet<Demo>();
my_set.add(new Demo("Joe", "Goldberg"));
System.out.println("Added a new element to the set");
System.out.println("Does the set contain a new instance of the object? ");
System.out.println(my_set.contains(new Demo("Jo", "Gold")));
}
}
実行結果
Added a new element to the set Does the set contain a new instance of the object? false
コードの解説
「Demo」クラスには、final修飾子が付いた2つの文字列フィールドと、それらを初期化するコンストラクタが定義されています。さらに、equalsメソッドがオーバーライドされており、引数として渡されたオブジェクトが特定のクラスのインスタンスであるかどうかをinstanceof演算子で判定しています。インスタンスであればtrueを返し、そうでなければオブジェクトをキャストして各フィールドをequals関数で比較します。
mainメソッドでは、新しいSet(HashSet)を作成し、Demoクラスのインスタンスを1つ追加しています。その後、containsメソッドを使って、別のインスタンスがセットに含まれているかどうかを確認しましたが、結果はfalseとなりました。
なぜfalseが返されるのか?
HashSetは内部処理において、まずhashCode()で要素の格納場所(バケット)を特定し、その後equals()によって等価性を比較します。この例ではhashCode()がオーバーライドされていないため、内容が似たオブジェクトであってもそれぞれ異なるハッシュ値を持ち、別々のバケットに格納されてしまいます。そのため、contains()は目的の要素を見つけられず、falseを返すのです。
このことからも分かるように、HashSetを正しく活用するには、equals()だけでなくhashCode()も必ずセットで適切にオーバーライドすることが極めて重要です。これにより、意図したとおりの重複排除と高速な検索が実現できます。
-
Javaの「孤立の島(Island of Isolation)」とは?ガベージコレクションの仕組みを解説
Javaでは、使用済みのオブジェクトはガベージコレクタ(Garbage Collector)によってメモリから解放されます。オブジェクトが破棄されるのは、そのオブジェクトへの参照がどこにも存在しなくなったときです。ガベージコレクタは、破棄対象となったオブジェクトに対して「finalize」メソッドを呼び出します。 孤立の島(Island of Isolation)とは? 2つのオブジェクト「a」と「b」が互いに参照し合っており、それらを参照する外部のオブジェクトが一切存在しない状態を、「孤立の島(Island of Isolation)」と呼びます。 これは、互いに参照し合うオブジェクトの集ま
-
Java 9のdestroyForcibly()メソッドとは?プロセスを強制終了する方法を解説
destroyForcibly() メソッドは、実行中のプロセスを強制的に終了(キル)するために使用されます。このメソッドは、プロセスが正常に終了しない場合や、フリーズ(応答停止)してしまった場合に特に役立ちます。 例えば、destroyForcibly() を呼び出した後でも isAlive() メソッドが true を返すことがあります。これは、OSレベルでの終了処理が完了するまでに時間差があるためです。また、destroyForcibly() は終了要求が正常に受け付けられた場合は true を返し、そうでない場合は false を返します。 構文 boolean destroyForc