詳細シニアJAVA面の質問() - の差CurrentHashMap、HashMapの、ハッシュテーブル

流行はテンセント、Huawei社の部門は、基本的に巨大なアリに直面し、いくつかの同僚が終了する前に非常に良好な関係を作っており、平和、また提供の満足度を持っている、私は彼らが経験した顔の質問に準備されますその後、自分の状況に応じて収集した解答を確認します。私たちは一緒に勉強します、アウト共有する週に二つの質問の最小(拡張問題を含んでいます)。

の差CurrentHashMap、ハッシュマップ、ハッシュテーブル

差分の一般的な方向である:
HashMapのスレッドセーフ、スレッドセーフなハッシュテーブルいずれかの時間だけつのスレッドはハッシュテーブル、CurrentHashMapスレッドセーフ、サブロックの導入を書き込むことができます。

詳細はHashMap

HashMapの構造

  • +、単一リンクのリスト以前に配列JDK1.8
  • 単独でリンクされたリスト配列JDK1.8 + +ブラックツリー後

使用はなぜ赤黒木

でも、合理的な負荷率、その後、ハッシュアルゴリズムの設計、必然的に長すぎるジッパーケースがあるでしょうジッパーが長すぎる表示されたら、それは真剣にHashMapのパフォーマンスに影響します。したがって、JDK1.8バージョンでは、データ構造はさらに、赤黒木の導入を最適化されています。リストが長すぎる(デフォルトでは8以上)である場合、リストはフラッシュCRUD HashMapを使用して、赤黒木が少ない赤黒木リストに6以上の長さの性能特性を改善する、赤黒木に変換されます。

課外演習:赤黒木は何ですか?
赤黒木は平衡二分木であり
、以下の特徴を有する、回転によるバランス及び色を維持します

  • 各ノードは、黒または赤のいずれかです。
  • ルートノードは黒です。
  • 各リーフ(NIL)は黒です。
  • 2つの子は必ずしも黒各赤ノードノード。
  • 各パスのリーフノードに任意のノードは、黒のノードの同じ番号が含ま。

HashMapのは、()メソッドの実装プロセスを置きます

HashMapのは、スキームに入れます

ハッシュ値計算

ハッシュ関数は、ハッシュコードキーを介して取得することで、int型値は、ハイとローの16ビット、16ビットのXOR演算のハッシュコードを聞かせて、32です。これは、摂動機能、3つの理由、そのようなAの設計と呼ばれています。

  • より良く分散し、ハッシュ衝突を最小化するようにしてください。
  • それは高周波動作であるので、ビット操作のでアルゴリズムは、可能な限り効率的なようでなければなりません。
  • ハイとローはローのランダム性を高めるための方法として、元のハッシュコードを混合し、衝突を減らします

オブジェクトは、どのようなのHashMapのキーの値とすることができます

オーバーライドのhashCodeやキーなどにオブジェクトに等しいです。

ハッシュテーブルについて

ハッシュテーブルは、配列全体をロックし、操作の方法に直接追加キーワードを同期しています。スレッドの安全性を達成するように。キーまたは値がnullにすることはできませんかどうか

ConcurrentHashMapの概要

+セグメント配列リストの実装
のConcurrentHashMapを同時にキーが使用される分離技術であるロック複数の修飾、せる
だけではなく、テーブル全体をロックする必要があるかもしれないような大きさ()とのcontainsValue()などのいくつかの方法は、断面を必要とし、操作後だけでなく、すべてのセグメントのロックを解除するために、すべてのセグメントをロックするために必要セグメント。

地図は、タイトルを拡張します

整然としたマップ

ハッシュマップ、ハッシュテーブル、ConcurrentHashMapのランダムハッシュ値に応じて挿入されて、乱れている
内部のLinkedHashMapためのLinkedHashMap注文が維持される単一のリンクされたリストは、頭と尾のノードがあり、挿入ソート順序またはアクセス順序によって達成することができます。
TreeMapのは、(コンパレータは、インターフェイスを実装する)、天然の順序またはコンパレータキーシーケンスに従って順序付けられ、内部が赤黒木によって達成されます。

公開された18元の記事 ウォン称賛45 ビュー110 000 +

おすすめ

転載: blog.csdn.net/zhibo_lv/article/details/105120288