hashSets を使用してテキスト ドキュメントのディレクトリを比較する Java クラスのプログラムがあります。基本的に、私の計画は、論文ごとに文字列の hashSet を作成し、2 つの論文の hashSet を 1 つの hashSet に追加して、同じ 6 単語シーケンスの数を見つけることです。
私の質問は、衝突を手動でチェックして処理する必要がありますか、それとも Java が代わりにそれを行うのでしょうか?
Java ハッシュ マップ/セット ハッシュの衝突を自動的に処理します。これが、equals
とhashCode
メソッドの両方をオーバーライドすることが重要な理由です。それらの両方がセットによって使用され、重複または一意のエントリを区別します。
複数のオブジェクトが同じハッシュによって参照されるため、これらのハッシュ衝突はパフォーマンスに影響を与えることに注意することも重要です。
public class MyObject {
private String name;
//getter and setters
public int hashCode() {
int hashCode = //Do some object specifc stuff to gen hashCode
return int;
}
public boolean equals(Object obj) {
if(this==obj) return true;
if(obj instanceOf MyObject) {
if(this.name.equals((MyObject)obj.getName())) {
return true;
}
return false;
}
}
}
注: String などの標準 Java オブジェクトはすでに hashCode と equals を実装しているため、独自の種類のデータ オブジェクトに対してのみ実装する必要があります。
ハッシュの衝突を要求しなかったと思いますよね?問題は、HashSet a と HashSet b が、たとえば a.addAll(b) によって単一のセットに追加された場合にどうなるかです。
答えは、すべての要素が含まれ、重複がないということです。文字列の場合、これは、追加前の a.size() - 追加後の a.size() + b.size() を使用して、セットから等しい文字列の数を数えることができることを意味します。
一部の文字列が同じハッシュ コードを持っていても、等しくなくても問題ありません。