原則のLinkedHashMap

LinkedHashMapプロパティ

保存されたハッシュ値シーケンス・HashMapのキーであるとき、およびイテレータトラバーサルが乱れ、そして時には我々は、挿入順にマップが返され、そうのLinkedHashMapを出荷しなければならない必要がある場合、特定の順序で入れるとHashMapの保存には、順不同です生まれました。

原則

LinkedHashMapすぐ外にテーブルベースのHashMapを達成するため、余分な二重にリンクされたリストを維持します。方法newNode、afterNodeRemoval等を実装し、増加又はその内部リストのサブクラスはイテレータインターフェイスを実装維持するために減少したときに、内部ロジックに戻り、図のようにリストデータをリンクさを入れて取り除きます。

LruCache与のLinkedHashMap

、キューバッファが一杯になったときに、非常に単純なLRUキューを使用することによって達成のLinkedHashMap特性は、ヘッドを排除ノードを制限され、要求を取得する各ノードは、その後、ヘッドノードのデータが頻繁に使用されていないキューの最後に配置され、そしてremoveEldestEntryを用いる方法判断と時間でのデータの出し入れ。コードは、パブリッククラスMyLruCache <K、V> {プライベート静的最終フロートhashTableLoadFactor = 0.75Fは以下の通りである。民間のLinkedHashMap <K、V>マップ;プライベートint型cacheSizeの。

public MyLruCache(int cacheSize) {
    this.cacheSize = cacheSize;
    int hashTableCapacity= (int) (Math.ceil(cacheSize/hashTableLoadFactor)+1);
    map=new LinkedHashMap<K,V>(hashTableCapacity,hashTableLoadFactor,true){
      
        @Override
        protected boolean removeEldestEntry(Map.Entry<K, V> eldest) {
            return size() > MyLruCache.this.cacheSize;
        }
    };
}

public V get(K key){
    return map.get(key);
}
public void put(K key,V value){
    map.put(key,value);
}
public synchronized int usedEntries() {
    return map.size();
}
public synchronized void clear() {
    map.clear();
}
public synchronized Collection<Map.Entry<K, V>> getAll() {
    return new ArrayList<Map.Entry<K, V>>(map.entrySet());
}
}
复制代码

基準https://juejin.im/post/5a4b433b6fb9a0451705916f侵害により本明細書にした場合、すぐに処理を通知します

おすすめ

転載: juejin.im/post/5d3c4180e51d454f6f16ece7