流行はテンセント、Huawei社の部門は、基本的に巨大なアリに直面し、いくつかの同僚が終了する前に非常に良好な関係を作っており、平和、また提供の満足度を持っている、私は彼らが経験した顔の質問に準備されますその後、自分の状況に応じて収集した解答を確認します。私たちは一緒に勉強します、アウト共有する週に二つの質問の最小(拡張問題を含んでいます)。
の差CurrentHashMap、ハッシュマップ、ハッシュテーブル
差分の一般的な方向である:
HashMapのスレッドセーフ、スレッドセーフなハッシュテーブルいずれかの時間だけつのスレッドはハッシュテーブル、CurrentHashMapスレッドセーフ、サブロックの導入を書き込むことができます。
詳細はHashMap
HashMapの構造
- +、単一リンクのリスト以前に配列JDK1.8
- 単独でリンクされたリスト配列JDK1.8 + +ブラックツリー後
使用はなぜ赤黒木
でも、合理的な負荷率、その後、ハッシュアルゴリズムの設計、必然的に長すぎるジッパーケースがあるでしょうジッパーが長すぎる表示されたら、それは真剣にHashMapのパフォーマンスに影響します。したがって、JDK1.8バージョンでは、データ構造はさらに、赤黒木の導入を最適化されています。リストが長すぎる(デフォルトでは8以上)である場合、リストはフラッシュCRUD HashMapを使用して、赤黒木が少ない赤黒木リストに6以上の長さの性能特性を改善する、赤黒木に変換されます。
課外演習:赤黒木は何ですか?
赤黒木は平衡二分木であり
、以下の特徴を有する、回転によるバランス及び色を維持します
- 各ノードは、黒または赤のいずれかです。
- ルートノードは黒です。
- 各リーフ(NIL)は黒です。
- 2つの子は必ずしも黒各赤ノードノード。
- 各パスのリーフノードに任意のノードは、黒のノードの同じ番号が含ま。
HashMapのは、()メソッドの実装プロセスを置きます
ハッシュ値計算
ハッシュ関数は、ハッシュコードキーを介して取得することで、int型値は、ハイとローの16ビット、16ビットのXOR演算のハッシュコードを聞かせて、32です。これは、摂動機能、3つの理由、そのようなAの設計と呼ばれています。
- より良く分散し、ハッシュ衝突を最小化するようにしてください。
- それは高周波動作であるので、ビット操作のでアルゴリズムは、可能な限り効率的なようでなければなりません。
- ハイとローはローのランダム性を高めるための方法として、元のハッシュコードを混合し、衝突を減らします
オブジェクトは、どのようなのHashMapのキーの値とすることができます
オーバーライドのhashCodeやキーなどにオブジェクトに等しいです。
ハッシュテーブルについて
ハッシュテーブルは、配列全体をロックし、操作の方法に直接追加キーワードを同期しています。スレッドの安全性を達成するように。キーまたは値がnullにすることはできませんかどうか
ConcurrentHashMapの概要
+セグメント配列リストの実装
のConcurrentHashMapを同時にキーが使用される分離技術であるロック複数の修飾、せる
だけではなく、テーブル全体をロックする必要があるかもしれないような大きさ()とのcontainsValue()などのいくつかの方法は、断面を必要とし、操作後だけでなく、すべてのセグメントのロックを解除するために、すべてのセグメントをロックするために必要セグメント。
地図は、タイトルを拡張します
整然としたマップ
ハッシュマップ、ハッシュテーブル、ConcurrentHashMapのランダムハッシュ値に応じて挿入されて、乱れている
内部のLinkedHashMapためのLinkedHashMap注文が維持される単一のリンクされたリストは、頭と尾のノードがあり、挿入ソート順序またはアクセス順序によって達成することができます。
TreeMapのは、(コンパレータは、インターフェイスを実装する)、天然の順序またはコンパレータキーシーケンスに従って順序付けられ、内部が赤黒木によって達成されます。