集合应用场景2——数据结构

Stack:LIFO

ArrayList & LinkedList

LinkedList中实现的:

单向链表

+push(in:E e)
{//方法体:通过使用addFirst(e)
}

+pop()
{//通过使用removeFirst();
}

同理:也可以通过操作队尾实现。
//addLast(e) && removeLast();



Queue:FIFO

Queue  && Deque




双向链表:通过实现ListIterator接口

LinkedHashMap实现

LRU:last recently used 算法

public static void main(String[] args) {
//LRU:Least Recently Used,最近最少使用
//缓存:缓存热点数据,经常使用的数据
// 一种淘汰算法:
//当缓存已满时,再向缓存内添加内容时,删除(淘汰)掉缓存中已存在元素最近最少被使用的那个
//LinkedHashMap 支持LRU算法,
//LinkedHashMap 具有HashMap 的所有功能 +可保持插入顺序(遍历)
//HashMap + 双向链表
//双向链表:head、tail;after、before
//LinkedHashMap是有序的 boolean accessOrder
//1. 插入顺序:每次插入元素,将元素放到双向链表的末尾
//2. 访问顺序:每次插入、获取元素,将该元素放到双向链表的末尾
//---put()、get()元素放置末尾

//LinkedHashMap linkedHashMap = new LinkedHashMap(5);
LRU<String,String> lru = new LRU<>();
lru.put("001","macro");
lru.put("002","macro");
lru.put("005","macro");
lru.put("003","macro");
lru.put("004","macro");
System.out.println(lru);
System.out.println(lru.get("005"));
System.out.println(lru);
System.out.println(lru.put("004","huge"));
System.out.println(lru);
System.out.println(lru.put("064","huge"));
System.out.println(lru);

}

static class LRU<K,V> extends LinkedHashMap<K,V> implements Map<K,V> {
private int max = 5;
public LRU(){
//accessOrder: true---访问顺序;false---插入顺序
super(10,0.75f,true);

}

    //本质:在添加元素过程中,(业务流程决定:会调用removeEldestEntry()操作)
@Override
protected boolean removeEldestEntry(Entry<K, V> eldest) {
if(size()>max){
System.out.println("淘汰掉的元素:"+eldest);
return true;
}
return false;
}
}

猜你喜欢

转载自www.cnblogs.com/macro-renzhansheng/p/12537539.html