zoukankan      html  css  js  c++  java
  • LinkedHashMap 实现总结

    1. 继承于HashMap,定义了新的内部类Entry用于实现双向链表保存记录的插入或访问顺序;
    2. accessOrder用于指示链表保存记录采用的顺序,true为访问顺序,false为插入顺序;
    3. 加入新的记录时需要更新链表,访问记录时需要更新链表(更具accessOrder值判断是否实际更新);
    4. removeEldestEntry方法在LinkedHashMap用于表示缓存时有用,通过重载该方法(修改更新链表的逻辑以及返回值),删除有限容量下缓存中的最旧记录;
     1 public class MyLinkedHashMap<K, V> extends MyHashMap<K, V> {
     2     private boolean accessOrder;
     3 
     4     private Entry<K, V> header;
     5 
     6     public V get(K k) {
     7         Entry<K, V> e = (Entry<K, V>) getEntry(k);
     8         if (e == null) {
     9             return null;
    10         }
    11         e.recordAccess(this);
    12         return e.value;
    13     }
    14 
    15     @Override
    16     void addEntry(K k, V v, int index) {
    17         MyHashMap.Entry<K, V> old = table[index];
    18         Entry<K, V> e = new Entry<K, V>(k, v, old);
    19         table[index] = e;
    20         e.addBefore(header);
    21         size++;
    22         Entry<K, V> eldest = header.after;
    23         /**
    24          * 如果用於表示LRU算法的缓存,需覆盖removeEldestEntry,删除最旧条目同时返回true
    25          */
    26         if (removeEldestEntry(eldest)) {
    27             removeEntryForKey(eldest.key);
    28         } else {
    29             if (size >= threshold) {
    30                 resize(2 * table.length);
    31             }
    32         }
    33     }
    34 
    35     boolean removeEldestEntry(Entry<K, V> e) {
    36         return false;
    37     }
    38 
    39     private static class Entry<K, V> extends MyHashMap.Entry<K, V> {
    40         Entry<K, V> before, after;
    41 
    42         public Entry(K k, V v, MyHashMap.Entry<K, V> n) {
    43             super(k, v, n);
    44             // TODO Auto-generated constructor stub
    45         }
    46 
    47         private void remove() {
    48             before.after = after;
    49             after.before = before;
    50         }
    51 
    52         private void addBefore(Entry<K, V> existingEntry) {
    53             after = existingEntry;
    54             before = existingEntry.before;
    55             after.before = this;
    56             before.after = this;
    57         }
    58 
    59         void recordAccess(MyHashMap<K, V> m) {
    60             MyLinkedHashMap<K, V> lm = (MyLinkedHashMap<K, V>) m;
    61             if (lm.accessOrder) {
    62                 remove();
    63                 addBefore(lm.header);
    64             }
    65         }
    66 
    67     }
    68 
    69 }
  • 相关阅读:
    多线程GCD(二)
    多线程
    Runtime & Runloop
    MTK android 重启测试脚本
    ubuntu samba 配置简介
    Gerrit使用简介
    MTK andorid从底层到上层添加驱动
    MTK GPIO 新增变量配置
    MT6755 使用R63350 IC 出现唤醒概率性闪白,并导致ESD FAIL
    android L版本AAL新架构
  • 原文地址:https://www.cnblogs.com/infinityu/p/3259428.html
Copyright © 2011-2022 走看看