java.util.HashMap解読


HashMapには初期容量とロードファクタの2つがあります.デフォルトの初期容量は16で、ロードファクタは0.75です.つまり、mapに格納されているオブジェクトが16*0.75=12を超えると、hashMapはresize操作を行い、現在の容量を2倍にします.hashmapに格納されているentryは配列格納を使用するため、hashmapに格納されているオブジェクトが非常に多い場合、resize操作の性能消費は比較的大きく、例えば容量が10 wに達した場合、1回のresize操作で20 wの配列が初期化される.
コード解読:
前述したようにhashmapは配列を使用してデータを格納し、この配列はEntryオブジェクトであり、Entryオブジェクトはkey、value、および次のEntryへの参照を格納する単一チェーンテーブルである.競合が発生すると、現在のEntryは配列内の位置を置き換え、nextは以前の古い値を指します.これにより、単一チェーンテーブルの更新が完了します.
put:
public V put(K key, V value) {
    //hashMap          key
    if (key == null)
        return putForNullKey(value);
    int hash = hash(key.hashCode());
    int i = indexFor(hash, table.length);
    //hash            ,       ,    ,        ,       ,      :key    ,     ,     ;key       hash  
    for (Entry e = table[i]; e != null; e = e.next) {
        Object k;
        if (e.hash == hash && ((k = e.key) == key || key.equals(k))) {
            V oldValue = e.value;
            //   value  ,          
            e.value = value;
            e.recordAccess(this);
        //  :      
            return oldValue;
        }
    }
    modCount++;
    addEntry(hash, key, value, i);
    return null;
}

上にhash()法があり,keyオブジェクトのハッシュ値をビット別または演算してハッシュハッシュハッシュハッシュを計算する役割を果たし,アルゴリズムの利点を比較的詳細に述べる.HashMap,hash関数を深く理解する
get:
getメソッドコードは比較的簡単で、keyのhash値を計算し、この値を配列の下付きクエリ配列として計算し、Entryが指す単一チェーンテーブルを巡ります.見つかったら戻り、見つからなかったらnullを返す
public V get(Object key) {
    if (key == null)
        return getForNullKey();
    int hash = hash(key.hashCode());
    //      put        key   ,     put      ,get      value
    for (Entry e = table[indexFor(hash, table.length)];
         e != null;
         e = e.next) {
        Object k;
        if (e.hash == hash && ((k = e.key) == key || key.equals(k)))
            return e.value;
    }
    return null;
}

entrySet:
EntrySetメソッドは、mapにマッピングされたオブジェクトを巡回操作できるmap内のすべてのEntryを含むSetを返します.コードは比較的簡単です.私は以前、hashmapのkeySetメソッドを先に使用して、このSetを遍歴して、遍歴の中でhashmapのgetメソッドで値を取るのが悪い習慣がありましたが、hashmapのソースコードを見てから、直接entrysetよりも1回計算を多くして、データ量が小さいときに性能の違いを体得できず、データ量が大きいとき、違いを感じることができます.