Java
java.util
Arrays
HashSet
TreeSet
Deque
ArrayDeque
ArrayList
LinkedBlockingDeque
Map
HashMap
HashTable
TreeMap
LinkedHashMap
ComputeIfAbsent 在jdk8下的死锁场景
synchronized的锁升级过程
Volatile 关键字
redis 中的Lua脚本
AQS - 从干饭角度解析
ConcurrentHashMap
本文档使用 MrDoc 发布
-
+
首页
LinkedHashMap
## 描述 简单地讲,就是维护了顺序的hashmap,可以选择是插入顺序(默认)还是访问顺序。底层维护了一个双向链表的hash结构。从复杂度而言,成本几乎和treeMap一致。 提供了一个特殊的构造函数来创建一个按访问顺序排序的hashmap,其迭代顺序是其数据项最后一次访问的顺序,即最近最少访问到最近最多访问。这种顺序的Map非常适合构建 LRU 缓存。调用 put、putIfAbsent、get、getOrDefault、compute、computeIfAbsent、computeIfPresent 或 merge 方法会导致对相应条目的访问(假设它在调用完成后存在)。如果值被替换,replace 方法只会导致对条目的访问。 putAll 方法为指定映射中的每个映射生成一个条目访问,按照指定映射的条目集迭代器提供键值映射的顺序。没有其他方法生成条目访问。特别是,collection-views 上的操作不会影响 backing map 的迭代顺序。也留了一些hook钩子函数,例如重写 removeEldestEntry(Map.Entry) 方法,就可以在将添加新数据对象时自动删除旧数据对象的策略(也就是hashcode和equal一致,但实际对象引用地址不同的数据项的处理,多用于缓存更新) ## 底层数据结构 ``` /** * HashMap.Node subclass for normal LinkedHashMap entries. */ static class Entry<K,V> extends HashMap.Node<K,V> { Entry<K,V> before, after; Entry(int hash, K key, V value, Node<K,V> next) { super(hash, key, value, next); } } /** * 双向链表的首节点 */ transient LinkedHashMap.Entry<K,V> head; /** * 双向链表的尾节点 */ transient LinkedHashMap.Entry<K,V> tail; /** * 此链接哈希映射的迭代排序方法:访问顺序为 true,插入顺序为 false(默认) * @serial */ final boolean accessOrder; ``` ## 构造LRU demo ``` public static class LRU<K, V> extends LinkedHashMap<K, V> { public LRU() { super(16, 0.75f, true); } @Override protected boolean removeEldestEntry(Map.Entry<K, V> eldest) { return true; } } ```
寒烟濡雨
2022年6月11日 16:05
转发文档
收藏文档
上一篇
下一篇
手机扫码
复制链接
手机扫一扫转发分享
复制链接
关于 MrDoc
觅思文档MrDoc
是
州的先生
开发并开源的在线文档系统,其适合作为个人和小型团队的云笔记、文档和知识库管理工具。
如果觅思文档给你或你的团队带来了帮助,欢迎对作者进行一些打赏捐助,这将有力支持作者持续投入精力更新和维护觅思文档,感谢你的捐助!
>>>捐助鸣谢列表
微信
支付宝
QQ
PayPal
Markdown文件
分享
链接
类型
密码
更新密码