LinkedHashMap 的 accessOrder 详解:你真的懂 LRU 缓存实现原理吗?

LinkedHashMap源码到面试题的全解析 是Java提供的一个集合类,它继承自HashMap,并在HashMap支持遍历时会按照插入顺序有序进行迭代。支持按照元素访问顺序排序,适用于封装LRU缓存工具。因为内部使用双向链表维护各个节点,所以遍历时的效率和元素个数成正比,相较于和容量成正比的HashMap来说,迭代效率会高很多。逻辑结构如下图所示,它是在HashMap基础上在各个节点之间维护一条双向链表,使得原本散列在不同bucket上的节点、链表、红黑树有序关联起来。是Java集合框架中HashMap的一个子类,它继承了HashMap。 阅读详情

第一章:LinkedHashMap 的 accessOrder 概述

在 Java 集合框架中,LinkedHashMap 是 HashMap 的一个有序子类,通过维护一条双向链表来保证元素的迭代顺序。其核心特性之一是可以通过构造函数参数控制排序行为,其中 accessOrder 参数决定了映射的排序模式。

访问顺序的作用

当 accessOrder 设置为 true 时,LinkedHashMap 将按照元素的访问顺序(包括读取和写入)重新排列内部链表,最近访问的元素会被移动到链表末尾。这种机制非常适合实现 LRU(Least Recently Used)缓存策略。

LinkedHashMap<Integer, String> map = new LinkedHashMap<>(16, 0.75f, true);
map.put(1, "A");
map.put(2, "B");
map.put(3, "C");
map.get(1); // 访问键 1
map.put(4, "D"); // 如果容量满,最久未使用的条目将被移除

上述代码中,由于启用了访问顺序,调用 get(1) 后,键 1 对应的条目会被移到链表末尾。后续插入新元素时,最久未访问的条目(如键 2)将优先被淘汰。

两种排序模式对比

模式accessOrder 值排序依据典型用途
插入顺序false元素插入时间保持添加顺序输出
访问顺序true最近访问时间LRU 缓存实现
  • 默认情况下,accessOrder 为 false,即按插入顺序排序
  • 启用访问顺序后,每次 get、put 更新都会触发位置调整
  • 需重写 removeEldestEntry 方法以支持自动清理过期条目

第二章:accessOrder 的核心机制解析

2.1 accessOrder 参数的定义与初始化原理

在 LinkedHashMap 中,`accessOrder` 是一个布尔型参数,用于控制元素的排序模式。当其值为 `false` 时,链表按插入顺序排列;若设为 `true`,则按访问顺序(最近访问的元素置于末尾)进行重排。
参数初始化机制
该参数在构造函数中初始化,默认为 `false`。可通过带参构造方法显式指定:

public LinkedHashMap(int initialCapacity, float loadFactor, boolean accessOrder) {
    super(initialCapacity, loadFactor);
    this.accessOrder = accessOrder;
}
上述代码展示了 `accessOrder` 的传递路径:开发者在实例化时传入布尔值,直接赋给内部字段,从而决定迭代顺序行为。
排序策略对比
  • 插入顺序:默认模式,元素按插入时间线性排列;
  • 访问顺序:启用后,get 操作会触发节点移至链尾,实现 LRU 缓存基础。

2.2 基于双向链表的元素排序策略分析

在双向链表中,每个节点包含前驱和后继指针,为排序操作提供了灵活的结构调整能力。相比单向链表,其反向遍历特性可显著提升某些排序算法的效率。
插入排序的优化实现
对于小规模或近似有序的数据集,插入排序在双向链表上表现优异。通过前后指针快速定位插入位置,减少遍历开销。

typedef struct Node {
    int data;
    struct Node *prev, *next;
} Node;

void sortedInsert(Node** head, Node* newNode) {
    if (*head == NULL || (*head)->data >= newNode->data) {
        newNode->next = *head;
        if (*head) (*head)->prev = newNode;
        *head = newNode;
    } else {
        Node* current = *head;
        while (current->next && current->next->data < newNode->data)
            current = current->next;
        newNode->next = current->next;
        if (newNode->next) newNode->next->prev = newNode;
        current->next = newNode;
        newNode->prev = current;
    }
}
该实现通过 prev 指针避免了单向链表中寻找前驱节点的额外循环,时间复杂度稳定在 O(n²),但常数因子更优。
性能对比
算法平均时间复杂度空间优势
插入排序O(n²)原地调整
归并排序O(n log n)可拆分合并

2.3 put、get 操作对访问顺序的影响实验

在 LinkedHashMap 中,put 和 get 操作会直接影响元素的访问顺序,尤其是在启用访问顺序模式(accessOrder = true)时。
实验代码示例

LinkedHashMap<String, Integer> map = new LinkedHashMap<>(16, 0.75f, true);
map.put("A", 1);
map.put("B", 2);
map.get("A"); // 访问 A
map.put("C", 3);
System.out.println(map.keySet()); // 输出: [B, C, A]
上述代码中,启用访问顺序后,get("A") 将 A 移至链表尾部。后续插入 C 也置于尾部,体现“最近访问”优先靠后的排序策略。
操作影响对比
操作序列插入顺序访问后顺序
put(A), put(B), get(A)A → BB → A
put(C)A → B → CB → C → A

2.4 构造函数中 accessOrder 的配置陷阱与最佳实践

在 Java 的 LinkedHashMap 中,构造函数的 accessOrder 参数控制着元素的迭代顺序。若设置为 true,则启用访问顺序模式,最近访问的条目会被移动到链表尾部;否则为插入顺序。
常见陷阱
开发者常误以为启用 accessOrder = true 即可自动实现 LRU 缓存,但仅此设置并不足够。必须重写 removeEldestEntry() 方法才能触发旧条目淘汰。
Map<String, String> map = new LinkedHashMap<>(16, 0.75f, true) {
    @Override
    protected boolean removeEldestEntry(Map.Entry<String, String> eldest) {
        return size() > 100; // 超过100条时淘汰最老条目
    }
};
上述代码通过匿名内部类方式自定义淘汰策略,true 启用访问顺序,结合 removeEldestEntry 实现真正的 LRU 行为。
最佳实践建议
  • 明确业务需求:是否需要基于访问频率优化数据局部性
  • 始终配合 removeEldestEntry 使用,避免内存泄漏
  • 测试不同负载下的性能表现,避免频繁重排序带来的开销

2.5 迭代器遍历顺序与结构变更的联动行为验证

在集合遍历时修改底层结构可能引发不可预期的行为。以 Go 语言为例,`map` 在迭代过程中若发生写入,运行时会触发 panic。
m := map[string]int{"a": 1, "b": 2}
for k := range m {
    m["c"] = 3 // 触发并发写入错误
    fmt.Println(k)
}
上述代码在运行时会检测到迭代器状态与底层哈希表结构不一致,从而主动中断程序。该机制依赖于哈希表头部的修改计数(modcount),每次增删改操作都会递增该值,而迭代器在每次循环中校验此值是否发生变化。
  • modcount 用于实现“快速失败”(fail-fast)策略
  • 并发读写 map 不仅影响遍历顺序,更可能导致程序崩溃
  • 安全做法是使用只读副本或显式加锁保护共享数据

第三章:LRU 缓存淘汰策略的理论基础

3.1 LRU 算法思想及其在缓存系统中的价值

核心思想与应用场景
LRU(Least Recently Used)算法基于“最近最少使用”原则管理缓存,优先淘汰最久未访问的数据。该策略符合程序局部性原理,在Web缓存、数据库索引缓冲等场景中广泛应用。
实现机制示例
使用哈希表结合双向链表可高效实现LRU缓存:

type entry struct {
    key, val int
    prev, next *entry
}

type LRUCache struct {
    capacity int
    cache    map[int]*entry
    head, tail *entry
}
上述结构中,cache 提供O(1)查找,双向链表维护访问顺序:每次访问将节点移至头部,满时从尾部淘汰。
  • 时间复杂度:查询、插入、删除均为 O(1)
  • 空间开销:额外指针维护顺序关系

3.2 LinkedHashMap 如何天然支持 LRU 语义

LinkedHashMap 是 HashMap 的子类,通过维护一个双向链表来记录插入或访问顺序,从而天然支持 LRU(Least Recently Used)缓存淘汰策略。
访问顺序控制
通过构造函数参数 `accessOrder` 控制是否启用访问顺序模式。当设置为 `true` 时,每次访问元素都会将其移至链表尾部,表示最近使用。

LinkedHashMap<Integer, String> cache = 
    new LinkedHashMap<>(16, 0.75f, true);
参数说明:第三个参数 `true` 启用访问顺序,使 `get()` 操作触发节点重排序。
自动淘汰机制
重写 `removeEldestEntry` 方法可实现容量限制下的自动清除:

protected boolean removeEldestEntry(Map.Entry<Integer, String> eldest) {
    return size() > MAX_CAPACITY;
}
该方法在插入新元素后自动触发,若返回 `true`,则移除链表头部最久未使用条目。

3.3 removeEldestEntry 方法的触发机制与性能权衡

触发条件与链表结构

removeEldestEntry 是 LinkedHashMap 中用于实现缓存淘汰策略的核心方法。每当向映射中插入新条目后,若 accessOrder 为 false,则在添加操作完成后自动调用此方法,判断是否需要移除最老条目。


protected boolean removeEldestEntry(Map.Entry<K,V> eldest) {
    return size() > MAX_ENTRIES;
}

上述代码定义了当缓存条目超过预设阈值 MAX_ENTRIES 时触发删除。该逻辑常用于实现 LRU 缓存,确保内存占用可控。

性能影响分析
  • 每次 put 操作都会触发检查,频繁调用可能带来额外开销;
  • 若判断逻辑复杂,将显著降低写入性能;
  • 合理设置容量阈值可在命中率与内存之间取得平衡。

第四章:基于 accessOrder 的实战 LRU 实现

4.1 自定义 LRU 缓存类的设计与编码实现

核心设计思路
LRU(Least Recently Used)缓存通过淘汰最久未使用的数据来优化内存使用。其关键在于快速访问和动态调整数据顺序,通常结合哈希表与双向链表实现。
  • 哈希表:实现 O(1) 的键值查找
  • 双向链表:维护访问顺序,便于头部插入、尾部删除和中间节点移动
代码实现
type LRUCache struct {
    capacity int
    cache    map[int]*list.Element
    list     *list.List
}

type entry struct {
    key, value int
}

func Constructor(capacity int) LRUCache {
    return LRUCache{
        capacity: capacity,
        cache:    make(map[int]*list.Element),
        list:     list.New(),
    }
}
上述结构体中,`cache` 存储键到链表节点的映射,`list` 维护元素访问顺序,最新访问的位于链表头部。每次 Get 或 Put 操作后,对应元素被移至头部,确保淘汰机制正确触发。

4.2 高并发场景下的线程安全增强方案(继承 ReentrantLock)

在高并发系统中,标准的 ReentrantLock 虽能保证基本的互斥与可重入性,但在特定业务场景下仍需扩展其行为以满足性能与监控需求。通过继承 ReentrantLock,可定制锁获取逻辑,实现如公平性优化、等待队列监控、超时统计等功能。
自定义可重入锁的扩展实现

public class MonitoredReentrantLock extends ReentrantLock {
    private final AtomicInteger waiters = new AtomicInteger(0);

    @Override
    public void lock() {
        waiters.incrementAndGet();
        try {
            super.lock();
        } finally {
            waiters.decrementAndGet();
        }
    }

    public int getQueueLength() {
        return waiters.get();
    }
}
上述代码通过原子计数器跟踪等待线程数量,waiters 在尝试获取锁前递增,获取成功后递减。该设计可用于实时监控锁竞争激烈程度,辅助系统弹性伸缩或告警触发。
应用场景与优势
  • 适用于高频读写分离服务中的资源争抢控制
  • 增强的监控能力有助于定位性能瓶颈
  • 继承机制保持了与原生锁的兼容性,便于无缝替换

4.3 性能测试:命中率、吞吐量与内存占用评估

在缓存系统性能评估中,命中率、吞吐量和内存占用是三个核心指标。高命中率意味着大多数请求可在缓存中得到响应,减少后端负载。
关键性能指标说明
  • 命中率:命中次数占总请求次数的比例,理想情况应接近90%以上
  • 吞吐量:单位时间内处理的请求数(QPS),反映系统处理能力
  • 内存占用:缓存数据消耗的内存大小,需平衡容量与成本
测试结果示例
配置命中率吞吐量 (QPS)内存占用
1GB 缓存86%12,5001.02 GB
4GB 缓存94%18,3004.11 GB
代码实现监控逻辑
func (c *Cache) Get(key string) (interface{}, bool) {
    c.mu.RLock()
    defer c.mu.RUnlock()
    if val, found := c.data[key]; found {
        c.stats.Hits++   // 命中计数
        return val, true
    }
    c.stats.Misses++     // 未命中计数
    return nil, false
}
该方法在每次读取时更新命中与未命中统计,便于后续计算命中率。通过原子操作或读写锁保障并发安全,避免统计误差。

4.4 实际应用场景模拟:HTTP 缓存、数据库查询结果缓存

在现代Web系统中,缓存广泛应用于提升响应速度与降低后端负载。典型场景包括HTTP缓存和数据库查询结果缓存。
HTTP 缓存机制
通过设置响应头控制浏览器或代理缓存行为:
Cache-Control: public, max-age=3600
ETag: "abc123"
Last-Modified: Wed, 21 Oct 2023 07:28:00 GMT
上述头部允许公共资源缓存1小时,结合ETag实现条件请求,减少带宽消耗。
数据库查询缓存
将高频查询结果存储于Redis等内存数据库中。例如:
result, err := cache.Get("user:123")
if err != nil {
    result = db.Query("SELECT * FROM users WHERE id = 123")
    cache.Set("user:123", result, 5*time.Minute)
}
该代码尝试从缓存获取用户数据,未命中则查库并回填,有效减轻数据库压力。
  • HTTP缓存适用于静态资源优化
  • 查询缓存适合读多写少的业务场景

第五章:总结与进阶思考

性能优化的实战路径
在高并发场景下,数据库查询往往是系统瓶颈。通过引入缓存层(如 Redis)并结合本地缓存(如 Go 的 sync.Map),可显著降低响应延迟。
  • 优先缓存热点数据,设置合理的过期策略
  • 使用读写分离减轻主库压力
  • 对高频小对象采用对象池技术复用内存

// 使用 sync.Pool 减少 GC 压力
var bufferPool = sync.Pool{
    New: func() interface{} {
        return new(bytes.Buffer)
    },
}

func processRequest(data []byte) *bytes.Buffer {
    buf := bufferPool.Get().(*bytes.Buffer)
    buf.Write(data)
    return buf
}
微服务治理的持续演进
随着服务数量增长,链路追踪和熔断机制变得至关重要。OpenTelemetry 提供了统一的可观测性框架,支持跨语言追踪上下文传播。
工具用途集成方式
Prometheus指标采集HTTP 拉取 + Exporter
Jaeger分布式追踪SDK 注入 + Agent 上报

客户端 → API 网关 → 认证服务 ↔ 配置中心

            ↓

          业务微服务 → 消息队列 → 数据处理服务

真实案例中,某电商平台通过引入异步事件驱动架构,将订单创建耗时从 800ms 降至 320ms,并提升了系统最终一致性保障能力。
使用LinkedHashMap实现简单的LRU LRU在很多缓存失效策略中会涉及,本质是一种节约更公平的节约资源策略,最近最少使用 java中的LinkedHashMap就有自带的实现LRU 简单说一下LinkedHashMap这种数据结构,本质是HashMap+双向链表,不仅有HashMap的特性,还能维护元素的顺序,示意图如下 使用LinkedHashMap实现简单的LRU package cn.com.suntree.utils.myself; import java.util.LinkedHashMap; import java.util.M 阅读详情

相关推荐

面试官:如何用LinkedHashMap实现LRU

上一篇文章分析了HashMap的原理,有网友留言想看LinkedHashMap分析,今天它来了。 LinkedHashMap是HashMap的子类,在原有HashMap数据结构的基础上,它还维护着一个双向链表链接所有entry,这个链表定义了迭代顺序,通常是数据插入的顺序。 上图我只画了链表,其实红黑树节点也是一样的,只是节点类型不一样而已 也就是说我们遍历LinkedHashMap的时候,是从...

zy353003874的博客 2300

LinkedHashMap

一、基础概念 下图很好地还原了LinkedHashMap的原貌:HashMap和双向链表的密切配合和分工合作造就了LinkedHashMap。特别需要注意的是,next用于维护HashMap各个桶中的Entry链,before、after用于维护LinkedHashMap的双向链表,虽然它们的作用对象都是Entry,但是各自分离,是两码事儿。 LinkedHashMap的继承结构如图: HashMap与LinkedHashMap的Entry结构示意图如下图所示 1.遍历 LinkedHashMap进行

sinat_34814635的博客 604

Sparse4Dv3

instance_feature也设置为nn.Parameter。修正分支2*(linear->relu->linear->relu->layernorm)->linear->scale,分类分枝2*(linear->relu->layernorm)->linear(256,9),质量评估分枝2*(linear->relu->layernorm)->linear(256,2)。每组两类instance,1是加上范围(-x,x)内均匀分布噪声,2是加上(-2x,-x)U(x,2x)范围内均匀分布噪声。

yuanl15的博客 1352

关于LinkedHashMap中accessOrder属性的理解

今天学习了使用LinkedHashMap来实现LRU算法,具体的关于LinkedHashMap的深入了解可以查看:Java集合详解5:深入理解LinkedHashMap和LRU缓存这篇文章,在介绍accessOrder属性的时候说accessOrder设置为false时,按照插入顺序,设置为true时,按照访问顺序,不过我在查看JDK1.8的LinkedHashMap的put方法时...

qq_35634181的博客 6229

企业微信API实战:解密external_userid的跨应用一致性管理

本文深入探讨企业微信API中external_userid的跨应用一致性管理问题,解析其本质及在不同应用场景下的ID不一致挑战。通过ID转换与统一管理方案,结合unionid实现跨应用客户数据整合,提供实战代码示例和架构设计,助力企业构建高效的客户管理系统。

weixin_29258297的博客 638

ADS2023实战:手把手教你用Load-Pull设计40W LDMOS功率放大器(附工程文件)

本文以飞思卡尔MRF8P9040N LDMOS晶体管为例,详细介绍了在ADS 2023中设计一款40W功率放大器(PA)的全流程。内容涵盖从直流偏置设置、稳定性分析、核心的负载牵引(Load-Pull)仿真,到基于Smith圆图的匹配网络设计、谐波平衡性能验证,直至版图生成与优化。文章提供了手把手的实战指导和工程文件,旨在帮助射频工程师掌握高效率PA的设计方法与关键技巧。

cake8的博客 1075

LinkedHashMap实现LRU

前言: LinkedHashMap是HashMap的子类,在原有HashMap数据结构的基础上,它还维护着一个双向链表链接所有entry,这个链表定义了迭代顺序,通常是数据插入的顺序。 上图我只画了链表,其实红黑树节点也是一样的,只是节点类型不一样而已 也就是说我们遍历LinkedHashMap的时候,是从head指针指向的节点开始遍历,一直到tail指向的节点。 源码 public class LinkedHashMap<K,V> extends HashMap<K,V> imp

张井天的博客 2469

基于灰度信息的图像配准方法

图像配准方法分为三种:基于灰度信息方法、基于变换域方法和基于特征方法。基于灰度信息方法是直接根据图像或图像块灰度信息进行像素上的对齐,该方法主要思想是直接最小化图像信息差异。然而,图像信息差异的判断准则衍生出不同的配准方法。常见的基于灰度信息的图像配准方法包括互相关法、互信息法和误差平方和法。本节将分别对互相关法、互信息法和误差平方和算法展开介绍,并通过MATLAB进行演示。基于灰度的图像方法容易实现,但同样存在不足。该方法对成像条件(光照,遮挡)、图像形变旋转以及噪声极其敏感,同时具有较高的计算复杂度。

weixin_42068054的博客 3778

揭秘LinkedHashMap accessOrder:如何用它轻松实现高效LRU缓存机制

掌握LinkedHashMap accessOrder 的 LRU 实现技巧,轻松构建高效缓存机制。适用于频繁读写场景,通过重写removeEldestEntry方法控制容量,保持访问顺序,提升性能表现。源码级解析,值得收藏。

ByteChat的博客 741

yolov7目标追踪:基于自定义数据集完成检测

目标追踪包含两个阶段:(1)基于自定义数据集,训练yolo目标检测模型;(2)基于检测模型,将实时检测结果传递到StrongSORT追踪算法中,该算法在OSNet基础上结合运动和外观信息,可以跟踪yolo模型检测到的任何物体。

📷 图像处理践行者 | 传统算法 · 深度学习 · 多模态 | 分享实战经验与技术洞见,探索从像素到智能的无限可能。 2307

基于YOLOv10的微小目标检测,多头检测器提升小目标检测精度

引入多头检测器助力YOLOv10,暴力提升小目标检测性能

①答疑群聊服务;②YOLO大模型知识问答系统;③计算机视觉论文生成智能体; 2571

你真的懂LinkedHashMap吗?accessOrder与LRU的隐秘关联大揭秘

深入解析LinkedHashMap accessOrder的LRU机制,揭示其在缓存设计中的核心应用。通过accessOrder参数控制访问顺序,实现高效的最近最少使用淘汰策略,提升性能。适用于高频读写场景,是构建本地缓存的利器。值得收藏

PixelWander的博客 328

27、目标识别的最新进展

本文综述了目标识别(OID)领域的最新进展,重点介绍了质量评估、预处理和搜索空间缩减等关键技术。文章分析了多种质量指标,如缩减率、对完整性、召回率和精确率等,并探讨了它们的适用场景。同时,详细介绍了预处理中自动学习转换规则的方法,以及传统阻塞、排序邻域索引等搜索空间缩减技术。此外,文章还讨论了动态选择缩减技术的方法,并展望了未来研究方向,如更智能的预处理、自适应的缩减技术和与人工智能的结合。希望这些技术和方法能够为目标识别领域的研究和实践提供参考和帮助。

q5r6s7的博客 93

【Java集合框架隐藏技巧】:利用 accessOrder 实现高效 LRU 缓存的3种方式

掌握Java LinkedHashMap的accessOrder机制,轻松实现高效LRU缓存。详解按访问顺序排序的核心原理,结合重写removeEldestEntry、自定义构造函数等3种实战方法,适用于高频读写场景,提升缓存命中率,值得收藏。

CompiWander的博客 781

第81篇:Vibe Coding时代:LangGraph + Eval评估体系实战,解决 Agent 优化全靠感觉的问题

本文介绍了一个为LangGraph Coding Agent设计的评估体系解决方案。文章首先指出了当前AI Coding Agent开发中的常见问题:优化过程缺乏客观评估标准,导致改进效果难以量化。随后提出了一个完整的评估框架,包括评估指标(任务成功率、质量指标、安全指标、成本指标和流程指标)、项目结构设计和评估案例集。 核心内容包括: 设计了JSON格式的评估案例集,覆盖正常任务、边界任务和高风险场景 实现了模拟Agent输出的演示代码 构建了多维度评分系统,包括关键词匹配、禁用词检测和成本评估 提供了评

sundong_81的博客 48

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

【Java集合性能优化】:深入解析LinkedHashMap accessOrder实现LRU的底层原理

掌握LinkedHashMap accessOrder 的 LRU 实现,高效解决缓存淘汰问题。适用于高频读写场景,通过重写removeEldestEntry方法实现自动清理,提升集合性能。底层基于双向链表维护访问顺序,兼顾查询效率与顺序控制,值得收藏。

LogicShoal的博客 422

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

揭秘 LinkedHashMap 的 accessOrder 机制:为何设置为 true 就能实现访问排序?

掌握Java LinkedHashMap的accessOrder机制,解析设置为true后如何实现访问排序。适用于LRU缓存等场景,通过get操作调整节点顺序,保持访问顺序特性。深入理解其原理与应用,值得收藏。

AlgoInk的博客 610

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

【LinkedHashMap LRU实现核心揭秘】:深入解析accessOrder工作机制与性能优化策略

掌握LinkedHashMap accessOrder 的 LRU 实现原理,深入解析其双向链表与哈希表协同机制,适用于缓存设计等高频场景。揭示访问顺序更新策略与性能优化技巧,提升数据操作效率,值得收藏。

InstrFun的博客 808

你必须掌握的 LinkedHashMap 关键参数:accessOrder 的5个核心应用场景

掌握Java LinkedHashMap的accessOrder参数,轻松实现LRU缓存与访问排序。详解其在数据统计、会话管理、缓存淘汰等5大场景的应用,结合get、put方法说明访问顺序控制机制,提升数据处理效率,值得收藏。

PixelShoal的博客 877

【Java集合进阶必读】:利用LinkedHashMap accessOrder构建高性能LRU缓存的完整指南

掌握LinkedHashMap accessOrder 的 LRU 实现技巧,高效构建高性能缓存机制。适用于频繁读写场景,通过重写removeEldestEntry方法控制容量,保持访问顺序,提升命中率。源码级解析+实战示例,值得收藏。

ProceShoal的博客 821

Java LinkedHashMap深度解析:有序HashMap + LRU缓存的完美融合!

是HashMap的子类,在HashMap的基础上额外维护了一个双向链表,用于保存元素的插入顺序或访问顺序,支持有序遍历。序号要点①继承自HashMap,拥有O(1)的快速查找能力②额外维护双向链表,保证元素顺序③两种顺序模式:插入顺序(默认)、访问顺序(accessOrder=true)④轻松实现LRU缓存⑤非线程安全,并发场景需包装⑥内存略大于HashMap(多了前后指针)是 Java 集合框架中的一颗璀璨明珠——它巧妙地将HashMap的O(1) 查找效率与双向链表的顺序性。

✨ 欢迎来到【Seal ^_^ 的优快云博客】!✨ 318

揭秘LinkedHashMap LRU机制:如何用accessOrder提升缓存效率?

掌握LinkedHashMap accessOrder 的 LRU 实现,轻松构建高效缓存机制。通过设置accessOrder为true,按访问顺序排列元素,结合重写removeEldestEntry方法,实现自动淘汰旧数据,适用于热点数据缓存场景,提升系统性能,值得收藏。

CompiShoal的博客 256

面试必问:LinkedHashMap的accessOrder是如何实现LRU的?

掌握LinkedHashMap accessOrder 的 LRU 实现原理,轻松应对缓存淘汰策略面试题。详解accessOrder参数如何通过访问顺序维护元素链表,实现高效的LRU缓存机制,适用于热点数据统计、内存优化等场景,值得收藏

Instrulink的博客 420

【高频面试题精讲】:从accessOrder到LRU缓存,彻底搞懂LinkedHashMap

深入解析LinkedHashMap accessOrder的LRU实现原理,掌握高效缓存设计方法。涵盖accessOrder参数作用、双向链表结构优势及在热点数据淘汰场景中的应用。理解底层机制提升性能优化能力,值得收藏。

DebugVibe的博客 456

LinkedHashMap为何能够实现LRU缓存

Jdk中HashMap作为高频使用的数据结构能够满足大多数业务场景,但要HashMap实现LRU缓存功能那就需要额外增加很多代码才能实现。如果想要按照插入顺序遍历HashMap同样需要额外的代码编写才能实现。本文重点讨论LinkedHashMap原理及其应用场景。 由于LinkedHashMap继承自HashMap,很多方法直接调用HashMap类中,因此阅读本前最好了解HashMap内部基本原理可以参考之前HashMap源码分析相关文章。 HashMap构造方法与内存空间分配 HashMap

woshiyizhiyu0的博客 750

高并发场景下的LRU优化方案:基于accessOrder的LinkedHashMap性能调优全解析

深入解析LinkedHashMap accessOrder 的 LRU 实现机制,针对高并发场景优化缓存性能。涵盖原理剖析、线程安全改进与实际应用场景,提升数据访问效率。方案兼具低延迟与高吞吐优势,值得收藏。

GatherLume的博客 696
上一篇: 【Java 13文本块深度解析】:彻底掌握trimIndent()的5大核心用法与避坑指南
下一篇: try-with-resources使用陷阱大盘点,90%的程序员都忽略的细节!
SimProceed
博客等级 码龄1年 146粉丝 2011原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值