二叉堆实现优先队列
二叉搜索树
红黑树
复用LinkedHashMap
- LinkedHashMap = HashMap(数组、链表、红黑树) + 双向链表;
- LinkedHashMap可以按两种顺序排列,一种是按照插入的顺序(FIFO),一种是按照 读取 的顺序(LRU)。
- LinkedHashMap建立了一个双向链表来维护这个顺序的,在每次访问、插入或者删除后,都会调用回调函数来进行 双向链表的维护;
void afterNodeAccess(Node<K,V> p) { }
在访问元素之后,将该元素放到双向链表的尾巴处(所以这个函数只有在按照读取的顺序的时候才会执行)void afterNodeRemoval(Node<K,V> p) { }
在删除元素之后,将元素从双向链表中删除void afterNodeInsertion(boolean evict) { }
在插入新元素之后,需要回调函数判断是否需要移除一直不用的某些元素
- LinkedHashMap的构造函数
public LinkedHashMap() {
super();
accessOrder = false;
}
public LinkedHashMap(int initialCapacity, float loadFactor, boolean accessOrder) {
super(initialCapacity, loadFactor);
this.accessOrder = accessOrder;
}
- 插入元素后执行回调
afterNodeInsertion
函数
void afterNodeInsertion(boolean evict) {
LinkedHashMap.Entry<K,V> first;
if (evict && (first = head) != null && removeEldestEntry(first)) {
K key = first.key;
removeNode(hash(key), key, null, false, true);
}
}
protected boolean removeEldestEntry(Map.Entry<K,V> eldest) {
return false;
}
- LRU代码
class LRUCache extends LinkedHashMap<Integer,Integer>{
private int capacity;
public LRUCache(int capacity) {
super(capacity,0.75F,true);
this.capacity = capacity;
}
public int get(int key) {
return super.getOrDefault(key, -1);
}
public void put(int key, int value) {
super.put(key,value);
}
@Override
protected boolean removeEldestEntry(Map.Entry<Integer,Integer> eldest){
return size() > capacity;
}
}