Java Hashtable要素のhashCodeは常に一意ですか?
そうでない場合、1 回の検索で適切な要素が得られることをどのように保証できますか?
必ずしも。2 つの異なる (そして等しくない) オブジェクトは、同じハッシュコードを持つことができます。
Javaドキュメントから:
hashCode の一般的な契約は次のとおりです。
Java アプリケーションの実行中に同じオブジェクトに対して複数回呼び出された場合は常に、オブジェクトの equals 比較で使用される情報が変更されていない限り、hashCode メソッドは一貫して同じ整数を返す必要があります。この整数は、あるアプリケーションの実行から同じアプリケーションの別の実行まで一貫性を保つ必要はありません。
equals(Object) メソッドに従って 2 つのオブジェクトが等しい場合、2 つのオブジェクトのそれぞれで hashCode メソッドを呼び出すと、同じ整数結果が生成される必要があります。
equals(java.lang.Object) メソッドに従って 2 つのオブジェクトが等しくない場合、2 つのオブジェクトのそれぞれで hashCode メソッドを呼び出すと、異なる整数結果が生成される必要はありません。ただし、プログラマーは、等しくないオブジェクトに対して個別の整数結果を生成すると、ハッシュテーブルのパフォーマンスが向上する可能性があることに注意する必要があります。
合理的に実用的である限り、クラス Object によって定義された hashCode メソッドは、個別のオブジェクトに対して個別の整数を返します。(これは通常、オブジェクトの内部アドレスを整数に変換することによって実装されますが、この実装手法は JavaTM プログラミング言語では必要ありません。)
そうです、通常hashCode
、オブジェクトのデフォルトは一意であると期待できます。ただし、メソッドが に保存しているクラスによってオーバーライドされている場合Hashtable
、すべての賭けは無効になります。
まず最初に。
後者は時代遅れと見なされているため、Hashtable の代わりに HashMap を使用することを検討する必要があります (ほとんどの場合必要とされない暗黙の同期が強制されます。同期された HashMap が必要な場合は、簡単に実行できます)。
さて、あなたの質問について。
ハッシュコードは数学的に一意であるとは限りませ
んが、HashMap (または Hashtable) を使用している場合は問題ありません。
2 つのキーが同じハッシュ コードを生成する場合、キーのそれぞれに対して equals が自動的に呼び出され、正しいオブジェクトが取得されることが保証されます。
String をキーとして使用している場合は心配ありません
が、独自のオブジェクトをキーとして使用している場合は、equals および hashCode メソッドをオーバーライドする必要があります。
equals メソッドは、HashMap の適切な操作に必須ですが、 hashCode メソッドは、ハッシュ テーブルが比較的まばらになるようにコーディングする必要があります (そうしないと、ハッシュマップは単なる長い配列になります)。
Eclipse を使用している場合は、hashCode と equals を生成する簡単な方法があり、基本的にすべての作業を自動的に行います。
理想的には、はい。実際、衝突は時々起こります。
Java Hashtable要素のhashCodeは常に一意ですか?
彼らはすべき。せめて同じクラスで。
そうでない場合、1 回の検索で適切な要素が得られることをどのように保証できますか?
hasCode
自分自身をクラスの適切な実装に指定する: equals() と hashCode をオーバーライドする