2

Javaの各オブジェクトにハッシュコード番号が含まれている理由を知りたかっただけです。一般に、各オブジェクトに異なるハッシュコードが割り当てられているのに、2 つのハッシュコード番号が異なる値を持つ場合がある理由。

ルール「ルール ? 2 つのキーが同じ場合、ハッシュコード番号は同じに生成されますが、2 つのハッシュコード番号が同じ場合、キーは同じでも異なっていてもかまいません。」

2つのキー(ハッシュテーブルコンテキスト内)が同じ場合、ハッシュコード番号が同じなのはなぜですか?

4

5 に答える 5

2

ハッシュ関数のポイントは、特定のキーを探す必要がある場所を大幅に絞り込むことです。

非常に基本的な例は、「単語の最初の文字」のハッシュ関数を使用した辞書です。その文字で始まる辞書の部分に検索を絞り込むと、ほとんどの文字がノックアウトされます。可能性を非常に効率的に。さらに、文字 J で始まる辞書の部分を見つけるのは比較的高速です。特定の単語を直接検索するよりもはるかに高速です。

ハッシュ関数のポイントは、ある程度一意なキーに関連付けられた特定の番号を見つけることです。すべてをノックアウトすることはできなくても、ほとんどの可能性をノックアウトします。

于 2013-02-01T04:31:35.970 に答える
1

Java の各オブジェクトはハッシュ コードを生成できる必要がありますが、ハッシュ コードを含む必要はありません。

ハッシュ コードは、ハッシュ マップやハッシュ セットなどの連想コンテナーでのルックアップに使用されます。ハッシュ コードは一意である必要はありませんが、オブジェクトがハッシュ マップのキーとして使用される場合、ハッシュ コードが一意であるほど優れています。2 つのキーが同じ場合、オブジェクトは (1) 論理的に等しいか、(2) equals2 つのオブジェクトを区別するためにオーバーライドする必要があります。

于 2013-02-01T04:31:59.353 に答える
1

JDK 内の多くの状況でハッシュコードが必要になるのは、一部のデータ構造がハッシュコードとそのプロパティを必要に応じて使用するためです (具体的にはHashMapHashSet)。これは、クラスの特定のインスタンスを十分に安全な方法で識別できるためです。

ハッシュコードは有限の情報(通常は固定サイズ) であるため、同じオブジェクトが同じハッシュコードを持つことを保証する必要がありますが、2 つの異なるオブジェクトが異なるハッシュコードを持つことを保証することはできません。これは、通常、ハッシュコードに格納される情報の量が、それを生成したオブジェクト内に含まれる量よりも少ないためです。必要なのは、衝突が発生する可能性が、目的のアルゴリズムでうまく機能するのに十分なほど低いことです (もちろん、これは、特定の状況でない限り、ハッシュコードの一意性を仮定できないことを意味します)

于 2013-02-01T04:32:12.960 に答える
0
public int hashCode()

オブジェクトのハッシュ コード値を返します。このメソッドは、 によって提供されるようなハッシュ テーブルの利点のためにサポートされていHashMapます (これは通常、オブジェクトの内部アドレスを整数 (32 ビット符号付き整数) に変換することによって実装されます)。

hashCodeの一般契約:

  • Java アプリケーションの実行中に同じオブジェクトに対してメソッドが複数回呼び出される場合は常に、オブジェクトの比較で使用される情報が変更されていない限り、hashCodeメソッドは一貫して同じ を返す必要があります。この整数は、あるアプリケーションの実行から同じアプリケーションの別の実行まで一貫性を保つ必要はありません。integerequals

  • メソッドに従って 2 つのオブジェクトが等しい場合、2 つのオブジェクトのそれぞれでメソッドequals(Object)を呼び出すと、同じ整数の結果hashCodeが生成される必要があります。2 つのオブジェクトがメソッドに従って等しくない場合、2 つのオブジェクトのそれぞれで hashCode メソッドを呼び出すと、異なる整数結果が生成される必要はありません。ただし、プログラマーは、等しくないオブジェクトに対して個別の整数結果を生成すると、ハッシュ テーブルのパフォーマンスが向上する可能性があることに注意する必要があります。equals(java.lang.Object)

  • hashCodeこのメソッドがオーバーライドされるときはいつでもメソッドをオーバーライドする必要があります。これequals()は、メソッドの一般契約を維持するためですhashCode。これは、等しいオブジェクトには等しいハッシュ コードが必要であると述べています。

注: 4,294,967,296 (2^32) の可能な hashCode が利用可能ですが、作成するオブジェクトの数ははるかに多いため、一部のオブジェクトは同じハッシュ コードを共有する必要があります。
参考
1 参考2

于 2013-02-01T05:33:31.293 に答える
0

2 つのキーが同じ場合、ハッシュコード番号が同じなのはなぜですか?

それがハッシュテーブルを機能させる理由です。

ハッシュ テーブルは、「等しい」キーが同じハッシュコードを持つという事実を利用して、ルックアップを行うときに調べる必要があるキーの数を削減するため、機能します (そして効率的です)。とのセマンティクスはequals(Object)hashcode()オブジェクト (セマンティック コントラクトに準拠する ...) をハッシュ テーブルのキーとして使用できるように機能するように定義されています1

ハッシュ テーブルが機能する方法と理由を理解するには、アルゴリズムに関する優れた教科書を読むか、このトピックに関するウィキペディアのページ ( http://en.wikipedia.org/wiki/Hash_table ) を読む必要があります。彼らは私たちよりもうまく説明できます...


1 - 別の前提条件があります...キーがハッシュテーブルで使用されている間、キーのハッシュコードは変更されるべきではありません。

于 2013-02-01T04:59:38.003 に答える