それは、慎重にソースコードのHashMapを読み取ったデータ構造の次のロット中に知識を埋め、表面に関連した質問の多くを磨く、仕上げするために3日かかりました
1. HashMapのの特性についての話?
nullにできるように、キー値を格納するための高速なアクセスを実現1.HashMap。キー値が繰り返し上書きされた場合、キー値は、繰り返すことはできません。
2.非同期スレッドセーフです。
前記底層は、ハッシュテーブルであり、(例えば、挿入の順序として)順序付け保証するものではありません
2.基本原理について何を語るのHashMap?
データ構造の原理に基づいてハッシュするjdk8リスト配列+ +赤黒木を使用します。我々は入れてオブジェクトを格納および取得するために得ます。我々は、キー値に渡し、キーのハッシュコード(のペアを作るために、()メソッドを置く場合)バケットエントリオブジェクトを格納するために、アレイ内の位置を取得するために計算されます。キーで正しいキーを見つけるために、バケットの位置で取得した取得するためにオブジェクトを取得した後、()メソッドた場合、戻り値にオブジェクト、そのオブジェクトに等しいです。
中に入れる方法について3.ハッシュマップの話が達成されますか?
1.鍵の算出ハッシュコード値(XOR演算Key.hashCodeの16ビット)
2.ハッシュテーブルが空の場合、ハッシュテーブルを初期化するために)(リサイズ呼び出し
3.衝突が直接テーブルをハッシュする要素を追加するために発生していない場合
4.衝突(ハッシュコードと同じ値)が決意の三種類のため、発生した場合
4.1:同じアドレスまたは同じ内容の鍵が等しい場合は、古い値を置き換えます
4.2:それは赤黒木である場合、ツリーは挿入法と呼ばれています
4.3:リスト構造は、ノードの挿入は、補間の終わり空になるまで、リストをループは、番号の挿入後のリストは赤黒木8に閾値に達したか否かを判定し、ノードが挿入要素を横断しなければなりませんそして、コンテンツの同じハッシュ値が、カバーしました。
前記バケットが一杯である場合は、その後の拡張のためにリサイズ、閾値よりも大きいです
4.拡張の必要性を何時間についてのハッシュマップの話、拡張サイズ変更は()を達成する方法ですか?
シーンをリコール:
1.配列テーブルを初期化します
2.配列表の大きさが閾値すなわち++サイズ>負荷率に到達したとき*ときに容量だけでなく、機能putValで
実装:(詳細に入ります)
古いアレイの容量によって決定1.初期化配列かどうかを決定するために0より大きい
いいえ:初期化しません
-
引数なしのコンストラクタを呼び出すかどうかを判断し、
-
です:デフォルトのサイズとしきい値を使用します
-
いいえ:使用コンストラクタを数回した後、当然のことながら、電力計算tableSizefor 2の容量を容量を初期化していません
-
拡張のため、拡張は、新しいハッシュテーブルにコピー操作で再要素を実行した後、(最大値未満で)倍増することです
一般的な用語で言えば:拡張が新しい配列を再割り当てする必要があることは、新しい配列が二回古い配列の長さであり、その後、全体の古い構造、行くために新しい構造に割り当てられた1を再ハッシュすることにより、すべての要素の1を通過します。
PS :可視の基礎となるデータ構造があるため、容量の問題の最後に、アレイを使用して、運用拡張する必要が
で取得する方法について5.ハッシュマップの話が達成されますか?
ツリー内で検索またはリンクされたリスト・トラバーサルは、見つけるためにそうでなければ、それは直接返さバレルの上部に見つけることができる場合は、添字および算術演算取得バケット位置、ハッシュされたハッシュコードをキーにequalsメソッドのを使用してハッシュ衝突を、存在する場合ノードを見つけるために、リストをトラバース。
HashMapのハッシュ関数約6話が実現する方法ですか?どのようなハッシュ関数を達成するための方法がありますか?
ハッシュキー操作、16ビットの高との排他的論理和を行うためのhashCode
私は、擬似乱数方式滞在以外ミドル二乗法がありますが、
7.なぜだけではなく、ハッシュ値が、16ビットの高とキーのXOR演算として?
動作は、アレイの位置によって決定されるので、唯一の最後の4つの重要、設計者鍵ハッシュ値16が高く、この時、排他的論理和&アレイの挿入位置を決定する演算を行うように実際の低これは、ハッシュ衝突の数を減らし、ランダム性を高め、ハイとローの組み合わせです。
HashMapのデフォルトの初期の長さは16であり、それぞれの場合に、自動的にまたは手動で初期容量を拡張し、2の累乗でなければなりません。
8.なぜ16?なぜ、2の累乗でなければなりませんか?入力値が2等10などのパワーでない場合は何が起こるのだろうか?
https://blog.csdn.net/sidihuo/article/details/78489820
https://blog.csdn.net/eaphyy/article/details/84386313
ハッシュの衝突を低減するデータの均一な分布については、1。データは、2のべき乗でない場合、ビット操作の位置を決定するためにアレイが、使用されているので、それは廃棄の数と空間ハッシュ衝突のアレイを増加させるであろう。(PS:実際には、効率性を考慮せずに、私は必要な長さを持っていないコンピューティングのパワーを置かないでください頼むことができている2)
2.入力データは、2の累乗、OR操作によりシフト操作により得られた肯定的なハッシュマップであり、その数は2のべき乗であり、最近のデジタル数の場合
9. 2つのオブジェクトが等しいハッシュコードがあるときに何が起こるかについての話?
キー値は、リストの後ろに交換され、古い値と同じ、またはリンクであれば、ハッシュ衝突が生成されます、リストは8に保存された赤黒木にしきい値よりも長いです
10.ハッシュコード2つのキーが同じであれば、どのようにオブジェクトの値を得るのですか?
同じハッシュコード、コンテンツ等号を比較してオブジェクトの値を取得します
11.「HashMapのサイズは、負荷率(ロードファクター)定義された容量を超えた場合、どのようにしますか?
拡張操作のためのしきい値を超えてしまいます、一般的な話は、拡張後の配列のサイズが2倍元の配列、どこへ行く新しいハッシュテーブルにオリジナルの要素を再ハッシングです。
違い12.HashMapとハッシュテーブル
同じ点:キーは、キーと値のペアが格納されています
違い:
-
キー値は、ハッシュテーブルが許可され、HashMapのがnullであることができます。
-
HashMapのそれは、スレッドセーフで、同期を考慮していません。ハッシュテーブルは、スレッドセーフで、同期の変更の層を置くためのAPI。
-
HashMapのクラスはクラスAbstractMapから継承し、ハッシュテーブルは、Dictionaryクラスを継承します。
-
イテレータ(イテレータ)。HashMapの反復子(イテレータ)イテレータは、フェイルファストで、列挙子Hashtableのイテレータは、フェイルファストではありません。(要素を追加または削除)、別のスレッドがHashMapの構造を変更しているときに、ConcurrentModificationExceptionをスローします。
-
同様ではなく、初期値の容量を増加させる:HashMapのデフォルトの容量サイズは16であり、大容量、容量はそれぞれ「元の容量X2」となります。ハッシュテーブルの既定の容量サイズは11であり、大容量、容量はそれぞれ「元の容量×2 + 1」となります。
-
ハッシュアルゴリズム値は異なるキーと値を追加しました:HashMapの要素は、カスタムハッシュアルゴリズムを使用して、追加されます。Hashtableの無いカスタムハッシュアルゴリズム、とhashCode(のキーを直接使用)。
13.パラメータloadFactorのHashMapを説明してください、その役割は何ですか?
loadFactorハッシュマップは、混雑度、ハッシュの同じ配列位置が動作する衝突確率を示します。素子アレイを受ける内部HashMapの75%のHashMapの長さに達した0.75に等しいデフォルトloadFactor、ハッシュマップあまりに混雑し、容量が必要とされる発現は、HashMapのloadFactorコンストラクタでカスタマイズすることができます。
14伝統的なハッシュマップの欠点(赤黒木のなぜ導入?)。
以前に実装JDK 1.8のHashMapがさらに良く得ることリスト、ハッシュ関数をリンクアレイの+は、一様分布要素百パーセントを達成することは困難です。ハッシュマップの要素の多数が同じバケットに記憶されている場合、長鎖は、バレルの下にあり、この時間は、HashMapの単鎖、単鎖n個の要素がある場合、時間複雑度がトラバースされると同等ですO(n)は、完全にその利点を失いました。このような状況に鑑みて、JDK 1.8は、この問題を最適化するために(ルックアップ時間複雑度はO(LOGN)である)赤黒木を導入しました。
15.キーとしてHashMapを使用した場合の要素の通常のタイプは、一般的には何を使用されていますか?
新しいStringのすべての操作はStringオブジェクト、新しいオブジェクトセグメンテーションステッチであるとして、整数、文字列不変このタイプを選択し、これらのクラスは、非常に標準化されたオーバーライドのhashCode()とequals()メソッドを持っています。不変クラスは、本質的にスレッドセーフであるため、
出典分析読書:
2. https://juejin.im/post/5ad40593f265da23750759ad
3. https://juejin.im/post/5afbff9451882542877353dd
4. https://blog.csdn.net/panweiwei1994/article/details/76555359#commentBox
5。
インタビューの質問のハッシュマップセットについての詳細:
https://zhuanlan.zhihu.com/p/32355676
https://zhuanlan.zhihu.com/p/40760616
https://juejin.im/post/5a99544ef265da23a334ab6c
https://www.jianshu.com/p/7af5bb1b57e2
https://baiqiantao.github.io/Java/%E9%9B%86%E5%90%88/3AFbAb/