1. ホーム

[解決済み】Java HashMapは、同じハッシュコードを持つ異なるオブジェクトをどのように処理するのですか?

2022-04-01 22:57:25

質問

私の理解では、そうだと思います。

  1. 2つのオブジェクトが同じハッシュコードを持つことは、完全に合法です。
  2. もし2つのオブジェクトが(equals()メソッドを使って)等しければ、それらは同じハッシュコードを持っていることになります。
  3. 2つのオブジェクトが等しくない場合、それらは同じハッシュコードを持つことはできません。

私は正しいですか?

さて、もしそうだとしたら、次のような疑問があります。 その HashMap は、内部でオブジェクトのハッシュコードを使用しています。もし二つのオブジェクトが同じハッシュコードを持つことができるのであれば、どのようにして HashMap どのキーを使っているか追跡できますか?

がどのようなものかを説明できる人はいますか? HashMap は、内部でオブジェクトのハッシュコードを使っているのですか?

どのように解決するのですか?

ハッシュマップは次のような仕組みになっています(少し簡略化していますが、基本的な仕組みは説明できます)。

バケツにはKey-Valueのペアが格納されます。各バケットには一意の番号があり、これがバケットを識別するためのものです。Key-Valueペアをマップに入れると、ハッシュマップはキーのハッシュコードを調べ、識別子がキーのハッシュコードであるバケットにそのペアを格納します。例えば キーのハッシュコードは235 -> ペアはバケット番号235に格納されます。(1つのバケツに複数のKey-Valueペアを格納することができることに注意してください)。

ハッシュマップにキーを与えて値を探す場合、まず与えたキーのハッシュコードを調べます。次に、ハッシュマップは対応するバケツを調べ、あなたが与えたキーとバケツ内のすべてのペアのキーを equals() .

キーのハッシュコードによって、ハッシュマップはどのバケツを探せばいいのかがすぐにわかるので、そのバケツにあるものに対してのみテストを行えばいいのです。

上記のような仕組みを見ると、「Security」(セキュリティ)のために、どのような要件が hashCode()equals() メソッドを使用します。

  • 2つのキーが同じである場合( equals() は以下を返します。 true を比較した場合)、その hashCode() メソッドは同じ数値を返さなければなりません。もしキーがこれに違反すると、等しいキーが異なるバケットに格納され、ハッシュマップは(同じバケットを探そうとするため)キーと値のペアを見つけることができなくなるかもしれません。

  • 2つのキーが異なる場合、そのハッシュコードが同じかどうかは問題ではありません。ハッシュコードが同じなら同じバケツに格納され、この場合、ハッシュマップは equals() で見分けることができます。