TreeSet
基于TreeMap实现
默认按key的插入顺序排序
底层是红黑树实现,如果比较器返回-1,则会放在左子树,1放在右子树中,如果0,则为当前节点
一直返回-1,则为逆序,一直返回1,则为顺序
HashSet
HashSet是基于HashMap实现的
LinkedHashMap
1.集成自HashMap
2.map中元素Entry head,tail;
Entry集成自HashMap.Entry,拓展了Entry before,after节点
3.默认按元素的写入顺序进行访问,accessOrder=false;
4.构造函数中可以配置accessOrder=true,按元素的put,get操作顺序进行访问
put()
执行hashmap中的put方法后,调用afterNodeAccess(e)方法,hashmap中实现为空,LinkedHashMap中具体实现,如果accessOrder=true,
则将新添加的元素e放在双向链表的最后tail=e
get()
执行hashMap的getNode(),然后,如果accessOrder=true,则将最新get的元素e,放置在双向链表末尾
如果当前元素对应的Node()为treeNode()[表明当前index处的元素个素已经超过了8个,转换成了红黑树],
缓存的实现机制:
【参考博客】https://blog.csdn.net/u012403290/article/details/68926201
1.FIFO
FiFoCache继承LinkedHashMap,需要重写afterNodeInsert()方法,HashMap该方法的默认实现为空,LinkedHashMap实现了该方法,方法中的字方法removeEldestEntry,Linked默认实现为false,所以默认是不删除最老的一条数据,在FiFoCache中重写该方法,指定size,如果hashmap中的size()方法返回值大于size,则删除最旧的一条数据
2.LRUCache. 最近一段时间最长时间没有使用
a.直接默认启用LinkedHashMap的accessOrder=true
b.LRUCache实现LinkedHashMap的removeEldestEntry
3.LFU (least Frequence use) 最近使用频率最少
LFUCache中维护
1.Map<Object,Object> map=Maps.newHashMap();
2.内部类Value,字段hitCount,实现了Comparable<Value>接口,按照hitCount比较。
remove()删除使用频率最低的元素,只需要按hitCount排序,删除hitCount最小的那个。
参考博客:
1.https://mp.weixin.qq.com/s/4yyspaFsz61764VsZjI5Vw【红黑树】