HashMapの配置中に衝突が発生した場合、マップのサイズが変更されますか、それともその特定のバケットのリストにエントリが追加されますか?
4 に答える
「衝突」と言うとき、同じハッシュコードを意味しますか?ハッシュコードは、HashMap内のどのバケットを使用するかを決定するために使用され、バケットは、同じハッシュコードを持つすべてのエントリのリンクリストで構成されます。次に、エントリが返されるか起動される(get / put)前に、エントリが等しいかどうかが比較されます(.equals()を使用)。
これは特にHashMapであり(これはあなたが質問したものであるため)、他の実装ではYMMVであることに注意してください。
どちらかが発生する可能性があります-それはHashMapの塗りつぶし率に依存します。
ただし、通常はそのバケットのリストに追加されます。HashMapクラスは、サイズ変更が比較的まれになるように設計されています(コストが高いため)。
のドキュメントでjava.util.HashMap
は、マップのサイズがいつ変更されるかを正確に説明しています。
HashMapのインスタンスには、そのパフォーマンスに影響を与える2つのパラメーターがあります。初期容量と負荷率です。
容量はハッシュテーブル内のバケットの数であり、初期容量は単にハッシュテーブルが作成されたときの容量です。
負荷率は、容量が自動的に増加する前にハッシュテーブルがどれだけいっぱいになるかを示す尺度です。
ハッシュテーブルのエントリ数が負荷率と現在の容量の積を超えると、ハッシュテーブルのバケット数が約2倍になるように、ハッシュテーブルが再ハッシュされます(つまり、内部データ構造が再構築されます)。
デフォルトの初期容量は16で、デフォルトの負荷率は0.75です。マップのコンストラクターで他の値を指定できます。
負荷率に達すると、サイズ変更が行われます。
HashMapの配置中に衝突が発生すると、エントリはその特定の「バケット」のリストに追加されます。負荷率に達すると、ハッシュマップのサイズが変更されます。