原理とHashMapの、ハッシュテーブル、ConcurrentHashMapの間の区別

原理とHashMapの、ハッシュテーブル、ConcurrentHashMapの間の区別

ハッシュ表

  • +キーまたは値がnull、することはできませんかどうか根本的な配列を達成するためのリンクリスト、スレッドセーフなデータが変更されたときにロック全体のハッシュテーブルを達成するために、スレッドセーフな方法で、低効率、ConcurrentHashMapのは、関連する最適化を行います
  • 11の初期サイズ、拡張:NewSizeパラメータ= oldSize新しい* 2 + 1
  • 指標の算出方法:指数=(ハッシュ&0x7FFFFFFFで)%tab.length

HashMapの

  • +リンクリスト下地アレイの実装、およびキーがnull、null値を格納することができる、スレッドセーフ
  • 2の特定のn乗のNewSizeパラメータ= oldSize新しい* 2、サイズ:16、膨張の初期サイズ
  • マップ全体の展開、毎回拡張、アレイ内の元の要素収納位置を再計算し、再挿入するために
  • 拡張要素が挿入された後(拡張を挿入した場合にそれを再度挿入しない場合、それは無効な拡張を生成します、)裁判官は、有効な拡張がないかもしれない必要があります
  • 要素の総数は、リストの長さを低減するために、拡張操作をトリガー、75%エントリアレイを超えるマップ、より均一な分配エレメント
  • 指標の算出方法:指数=ハッシュ&(tab.length - 1)

ConcurrentHashMapの

  • リンクされたリストの実装+を使用して、アレイの底部セグメント、スレッドセーフ
  • 全体マップは、N個のセグメントに分割されを通じて、我々はスレッドセーフ同じ提供することができますが、N回、16回、デフォルトのアップグレードの効率を高めるために。(読み取り操作は、変数のHashEntry値が揮発性であるため、ロックされませんが、また、最新の値を読み取るために確保すること。)
  • ハッシュテーブル全体ハッシュテーブルの同期化され、すなわち、各排他的スレッドが同時にConcurrentHashMapの複数の修飾を可能にテーブル全体をロックするために、キーは、分離技術の使用がロックであります
  • いくつかの方法は、サイズのような断面を、(必要)とのcontainsValue()、それらは、テーブル全体だけでなく、操作の後のすべてのセグメントをロックするために必要セグメントだけでなく、すべてのセグメントのロックを解除するためにロックする必要があるかもしれません
  • 拡張:拡張セグメント(セグメント要素セグメントはアレイエントリトリガー拡張の長さの75%以上に相当し、膨張が地図全体されない)、挿入前に検出または拡張を必要とする、膨張を効果的に無効防ぎます

おすすめ

転載: blog.csdn.net/m0_37587333/article/details/93736368