ハッシュマップには値の時間計算量が含まれています_終わりはありません! ?何年も経った今でも、インタビューはHashMapに質問しています



Hashmap Containsvalue Time Complexity _ There Is No End

d2024921c386576f71d28ab8b2880bf0.png

Javaの基本的なインタビューでは、HashMapはすべてのインタビュアーが尋ねなければならない質問のようです。

1. Java7のHashMap



Java 7 HashMapリンクリストのデータは「ヘッド挿入方法」に基づいているため、無限ループやデータ損失が発生する可能性があります

1779f9366d4411a9f76fa8e6b6ef0d3d.png

伝達関数



①「ヘッド挿入方式」エンドレスループ

写真のコードを閲覧するには数分かかります

bf2ba023d83f40e3df0d281ed53746b0.png

拡張前はこのようになっているとしましょう



d5b6f2fbf6b486efc4f7573047677a13.png

拡張後のシングルスレッドを想定すると、次のようになります。

1bc0180416f6f37404c82ef7a908d3fe.png

シングルスレッドでも問題ありません


2つのスレッドAとBがあるとします。

c859e70d4e5685883510f793a6bd3aa5.png

スレッドAには次の状況があります

64d9c5a797093fff95e7e442e451e291.png

スレッドAがハングし、スレッドBが開始して、サイズ変更操作が完了します。

1bc0180416f6f37404c82ef7a908d3fe.png

この時点で、多くのベテランが問題を認識しているはずです。スレッドBk2の次のノードはk1です。中断されたスレッドAは、ハッシュk2を準備します。スレッドBの影響により、再びハッシュk1に戻り、無限ループが発生します。

2. Java8のHashMap

Java 8のHashMapは、無限ループの問題を回避するために「テール補間法」を使用します。

スレッドAとスレッドBの両方が赤いボックス内のコードに対して実行されると、

2つの異なるデータのハッシュ値が同じである場合、

そして、位置はnullです、

データの上書きがあります。

d481698c125b8c76848a4189e531e4fe.png

@Python |テキスト