Javaの常用集合:ArrayListに/ベクタ; LinkedListは、HashMapの、HashSetの、のLinkedHashMap;のConcurrentHashMap

1.ArrayList /ベクトル

ArrayListの:
に拡張しない1.拡張1.5倍(=からelementData Arrays.copyOf(newCapacity、のからelementData)の;)
2.ダイナミックアレイ構造自体が(過渡によって修飾)の配列によって実現することができないが、このように内部であるシリアライズトラバーサルのシーケンスの各要素。
ベクター:
1.Vector ArrayListの基礎となるデータ構造等が、またデータを格納するダイナミックアレイ。ベクターは、同期コンテナがコンカレント・コンテナーではないですので、しかし、同期書き込みデータの使用は、add()メソッドを同期させることが、コストが大きいです。
(同期同時ます。https://blog.csdn.net/XM_no_homework/article/details/103888289)

2.LinkedList

LinkedListのは、基礎となる二重リンクリストに基づいて実施され
、LinkedListの挿入、削除、ポインタを移動する非常に高効率です。
クエリを横断する必要性を見つけることはあまり効率的です。

3.HashMap

ここに画像を挿入説明
HashMapのリストおよびアレイベースの下地層が達成されます。2つの重要なパラメータがあります。

  • 容量
  • 荷重係数

HashMapのサイズ> 16 *意志拡張0.75が生じる(容量と負荷率を自由に調節することができる)場合、容量のデフォルトサイズは、負荷率が0.75であり、16です。

ハッシュ衝突は
配列の限定された長さのため、必然的に計算によって得られた異なるキーインデックスの同じが存在することになるので、このような状況は、リンクされたリストを使用することによって解決することができ、リンクされたリストは、ハッシュマップの意志テーブル[インデックス]、ヘッドインサートを使用してデータ補間に形成されていますリストへ。

置く()およびGET()
GETなど置くが、この位置はkey.equals(K)によって、対応する要素を見つけるために、リスト全体を横断するリンクリストの必要性がある場合は、着信キーインデックスは、計算されます。

JDK1.8にハッシュマップの最適化:ハッシュ衝突リストを書き込んだ後の長さが閾値(デフォルト8)を超えるとテーブル64は短い長さ(または時間拡張)よりも、リストは赤黒木に変換されます

仮定するハッシュ重大な競合が、次に長いリストの後ろの配列は、再度時間複雑性はO(N)です。

赤黒木場合、時間計算量はO(LOGN)です。

大幅にクエリの効率を向上させます

4. HashSetの

HashSetのは、内部のHashMapによって実現、繰り返し要素のコレクションを格納するために許可されていません

HashSetのメンバ変数

    private transient HashMap<E,Object> map;

    // Dummy value to associate with an Object in the backing Map
    private static final Object PRESENT = new Object();

前記キー値セットは、追加されるの(プライベート静的最終的に存在する物体=新しいオブジェクト();)
値をHashSetのを複製するために書かれている場合、値は上書きされますが、鍵は、このように確実に、影響を受けません店舗だけでなく、繰り返しの要素でHashSetの。

5. Laidakedःashanap

LinkedHashMap HashMapのが、ニーズがソートシーンを持って対処するために基づきます。

それは、二重にリンクされたリストで構成される、基本となるHashMapの実装から継承されます。

LinkedHashMapの2種類の並べ替えがあります。

ソート書き込みシーケンス。
アクセス順序を並べ替えます。
モバイルアクセスが順次値に応じて、それぞれが繰り返される動作がソートされたリストのアクセス順序に従って得ることができるように、リストの最後へのアクセスを取得することを特徴とします。

実際にのLinkedHashMapは、オーダーのことを確実にするために二重にリンクされたリストを使用して、HashMapのように拡張されて

6.ConcurrentHashMap

構造図:
ここに画像を挿入説明
セグメントのConcurrentHashMapのアレイ、HashEntry組成物、およびHashMapのは、として依然として配列プラスリストです。

アクセスセグメントにHashEntryセグメント(セグメント)(ReentrantLockのから継承)ロックへのその後のアクセス

/**
 * Segment 数组,存放数据时首先需要定位到具体的 Segment 中。
 */
final Segment<K,V>[] segments;
transient Set<K> keySet;
transient Set<Map.Entry<K,V>> entrySet;

プット()

キーを標的とすることによって第一セグメントを(置く)を加えたロックセグメント、その後に特定の対応するセグメントに置く
ものの値がHashEntryある揮発性キーワード修飾が、しない保証不可分の同時、そう置く操作をそれでも必要なときにプロセスをロックします

()プロシージャを置きます:

  • ハッシュコードキーを流れる電流の目標HashEntryにおけるセグメントテーブル。
  • 着信キーと平等のための現在のトラバーサルキーは、上書きされ、古い値に等しいと判断された空でない場合は、HashEntryを横断。
  • 空にして、あなたが最初の容量が必要とされているかどうかを判断しますセグメント中に追加HashEntryを作成する必要はありません。
  • 最後に、我々は1で取得した現在のロックセグメントを持ち上げます

取得する()

()ロックされていない得る特定の要素を標的とすることにより、再びハッシュ、ハッシュを通過した後、単にターゲットの特定のセグメントキーに、。

取得したときにプロパティHashEntry volatileキーワードの値として、メモリの視認性を確保するために毎回ので、最新の値を変更しています。

全体のプロセスをロックする必要がないため、ConcurrentHashMapの取得方法は、非常に効率的です

CAS +の使用は、同時実行の安全性を確保するために、同期しながらJDK1.8は、元のセグメントのセグメント・ロックに放棄されました。

公開された28元の記事 ウォン称賛24 ビュー10000 +

おすすめ

転載: blog.csdn.net/XM_no_homework/article/details/103888289