ハッシュマップの基本実装原理は何ですか?
HashMapの内部実装原理は、データを配列とリスト(または赤黒木)に保存することです。
具体に言うと、HashMap内部には、配列があり、それぞれの要素をバケツと呼びます。HashMapにキーと値のペアを保存する際、まずキーのハッシュコード(hashCode()メソッドで取得)に基づいて配列内のインデックス位置を計算し、対応するバケツにそのペアを入れます。
ハッシュの衝突が発生した場合、異なるキーが同じインデックス位置にマッピングされた場合、HashMapではリンクリストを使用して衝突を解決します。Java 8以前では、ハッシュの衝突によるキー値ペアはリンクリストで接続され、リンクリストが形成されます。リンクリストの長さが一定の閾値(デフォルトは8)を超えると、リンクリストは赤黒木に変換され、検索、挿入、削除のパフォーマンスが向上します。Java 8以降では、リンクリストの長さが一定の閾値(デフォルトは8)を超えると、リンクリストはそのままですが、別の閾値(デフォルトは6)を超えると、リンクリストは赤黒木に変換されます。
データ検索時、HashMapはキーのハッシュコードに基づいて配列中のインデックス位置を計算し、対応するバケット内でキーと値のペアを検索します。リンクの長さが短い場合、リンクを直接走査して検索します。リンクの長さが長い場合、赤黒木の検索方法を使用します。
HashMapは、配列の要素数が一定の閾値(デフォルトは容量の0.75倍)を超えると、新しい大きな配列を作成してすべてのキーと値を再計算し、新しい配列に配置してハッシュ衝突の確率を減らす、という拡張操作を行います。この拡張操作により、配列の空間が再割り当てられ、インデックス位置が再計算されるため、一定のパフォーマンスコストが発生します。
HashMapは、配列とリンク付け(またはRed-Black Tree)の組み合わせを使って、ハッシュコードを計算してインデックス位置を解決し、高速な挿入、削除、および検索操作を提供するために実装されています。