Java-Link edHashMapソースコード解読
3117 ワード
Mapインタフェースのハッシュテーブルとリンクリストが実装され,予知可能な反復順序がある.この実装は、HashMapとは異なり、後者はすべてのエントリで実行される二重リンクリストを維持している.このリンク・リストは、通常、マッピングにキーを挿入する順序(挿入順序)である反復順序を定義します.マッピングでキーを再挿入すると、挿入順序は影響を受けません.(m.put(k,v)が呼び出される前にm.containsKey(k)がtrueに戻った場合、呼び出し時にキーkがマッピングmに再挿入されます.)
リンクハッシュマッピングを作成するための特別な
リンク・リストのメンテナンスにかかるコストが増加するため、HashMapよりもパフォーマンスが劣る可能性がありますが、この例外はLinkedHashMapのcollectionビューの反復に要する時間がマッピングのサイズに比例することです.HashMap反復時間は、必要な時間が容量に比例するため、費用がかかる可能性が高い.
リンクのハッシュマッピングには、初期容量とロード係数の2つのパフォーマンスに影響するパラメータがあります.それらの定義はHashMapと極めて似ている.このような反復時間は容量の影響を受けないため、初期容量に対して非常に高い値を選択することは、HashMapに対する影響よりも小さいことに注意してください.
このインプリメンテーションは同期ではありません.
挿入順にリンクされたハッシュ・マッピングでは、マッピングに含まれるキーに関連付けられた値のみが変更され、構造変更ではありません.
アクセス順にリンクされたハッシュマッピングでは、getクエリーマッピングのみを使用するのは構造変更ではありません.
public class LinkedHashMap extends HashMap implements Map
HashMapクラスを継承し、mapインタフェースを実装します.
リンクハッシュマッピングを作成するための特別な
が提供され、このハッシュマッピングの反復順序は、最後にエントリにアクセスする順序であり、最近アクセスが最も少ない順序から最近アクセスが最も多い順序(アクセス順序)までである.このマッピングは、LRUキャッシュの構築に適している.リンク・リストのメンテナンスにかかるコストが増加するため、HashMapよりもパフォーマンスが劣る可能性がありますが、この例外はLinkedHashMapのcollectionビューの反復に要する時間がマッピングのサイズに比例することです.HashMap反復時間は、必要な時間が容量に比例するため、費用がかかる可能性が高い.
リンクのハッシュマッピングには、初期容量とロード係数の2つのパフォーマンスに影響するパラメータがあります.それらの定義はHashMapと極めて似ている.このような反復時間は容量の影響を受けないため、初期容量に対して非常に高い値を選択することは、HashMapに対する影響よりも小さいことに注意してください.
このインプリメンテーションは同期ではありません.
Map m = Collections.synchronizedMap(new LinkedHashMap(...));
挿入順にリンクされたハッシュ・マッピングでは、マッピングに含まれるキーに関連付けられた値のみが変更され、構造変更ではありません.
アクセス順にリンクされたハッシュマッピングでは、getクエリーマッピングのみを使用するのは構造変更ではありません.
public class LinkedHashMap
HashMapクラスを継承し、mapインタフェースを実装します.
public LinkedHashMap() {
super();
accessOrder = false;
}
は、親構造メソッドを呼び出す構造メソッドによって知られる.<pre name="code" class="java">void init() {
header = new Entry<K,V>(-1, null, null, null);
header.before = header.after = header;
}
初始化链表结构
は、要素が含まれているかどうか、チェーンテーブルの形式でアクセスします.public boolean containsValue(Object value) { // Overridden to take advantage of faster iterator if (value==null) { for (Entry e = header.after; e != header; e = e.after) if (e.value==null) return true; } else { for (Entry e = header.after; e != header; e = e.after) if (value.equals(e.value)) return true; } return false; }
親クラスのclearメソッドを呼び出し、チェーンテーブル構造を変更します.public void clear() { super.clear(); header.before = header.after = header; }