/**
 * @Description 基于LinkedHashMap实现一个基于'LRU最近最少使用'算法的缓存,并且最多存MAX个值
 * @Author afei
 * @date:2021/4/25
 */
public class LRUCacheimplements  Iterable{
    private LinkedHashMaplinkedHashMap=new LinkedHashMap<>();
    private final int MAX=3;

    public void cache(K key,V value){
        if(this.linkedHashMap.containsKey(key)){
            this.linkedHashMap.remove(key);
        }else if(this.linkedHashMap.size()==this.MAX){
            Iteratorit=this.linkedHashMap.keySet().iterator();
            this.linkedHashMap.remove(it.next());
        }
        this.linkedHashMap.put(key,value);  //linkedHashMap在jdk1.8之后用头插法
    }

    @Override
    public Iterator iterator() {  //iterator方法
        Iterator<Map.Entry> it=this.linkedHashMap.entrySet().iterator();

        return new Iterator(){

            @Override
            public boolean hasNext() {
                return it.hasNext();
            }

            @Override
            public V next() {
                return it.next().getValue();
            }
        };
    }

    public  static void  main(String[] args){
        LRUCachelru=new LRUCache();
        lru.cache(1,"a");
        lru.cache(2,"b");
        lru.cache(3,"c");
        System.out.println(StreamSupport.stream(lru.spliterator(),false).map(x->x).collect(Collectors.joining("")));//abc
        lru.cache(2,"b");
        System.out.println(StreamSupport.stream(lru.spliterator(),false).map(x->x).collect(Collectors.joining("")));//acb

    }
}