资讯动态

Java中的LinkedHashMap有什么特点

发布时间:2026/8/6 10:51:46 来源:尧图企业网站定制
LinkedHashmap默认按插入顺序遍历。启用访问顺序后每次访问将相应节点移动到链表末端自然支持LRU缓存基于哈希表双向链表的底层重写removeldestentry可以实现容量限制的淘汰。保持插入或访问顺序LinkedHashMap 默认情况下按元素插入顺序进行遍历例如先 put(a,1)再 put(b2)遍历时一定要先 a 后 b。这个顺序不会因为 get 或重复 put 同一个 key 而变化-除非显式启用访问顺序模式。打开访问顺序(构造时间传输) true之后每次调用 get、put(含更新值)、replace 等待访问操作对应 Entry 它将移动到双向链表的末端。这意味着链表的末端始终是最近访问的元素而头部是最长时间没有访问的元素——这正是 LRU 缓存的核心逻辑基础。底部靠哈希表 双向链表协同工作它继承 HashMap实现哈希表结构(数组链表/红黑树)的复用 O(1) 平均搜索同时携带每个节点 before 和 after 指针构成双向链表。插入新元素时既写入哈希表又加入链表尾部 访问现有元素并启用它们 accessOrder在哈希表中定位后立即调整链表中节点的位置 unlink 再 append 到尾部 删除元素同步从哈希表和链表中删除相应的节点以确保两者的一致性。支持定制淘汰策略重写 removeEldestEntry在新元素插入触发扩容之前LinkedHashMap 会自动调用 removeEldestEntry 方法传入最古老的方法传入目前最古老的方法 Entry(即链表头节点)。默认返回 false不淘汰。若要实现固定容量 LRU 缓存只需重写此方法并返回 size() maxSize该方法只在 put 过程中触发get 不触发淘汰链表头部元素被淘汰自然符合“最长未使用”的语义线程不安全但可扩展性强它本身不是线程安全的在多线程环境下需要外部同步(如使用) Collections.synchronizedMap 包装)或与读写锁一起使用。它实现了 Cloneable 和 Serializable支持深度复制和序列化迭代器采用快速失败机制fail-fast如果结构被并发修改它将被抛出 ConcurrentModificationException。相比 HashMap内存成本略高(每个节点多两个指针)但是遍历性能更好——因为直接沿链表走不需要遍历整个哈希桶数组。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价