乐于分享
好东西不私藏

JDK源码阅读(5):LinkedHashMap——比HashMap多了一条"链",却优雅了十倍

JDK源码阅读(5):LinkedHashMap——比HashMap多了一条"链",却优雅了十倍

LinkedHashMap——比HashMap多了一条"链",却优雅了十倍

📅 JDK源码阅读系列 · 第5篇 上一篇第4篇我们聊了 CopyOnWriteArrayList,今天回到集合包,看看 HashMap 的亲儿子——LinkedHashMap。 别小看这个类,它只比 HashMap 多维护了一条双向链表,却实现了有序遍历+访问顺序两大杀手级能力。

1. 类的介绍

继承体系

java.lang.Object
  └── java.util.AbstractMap<K,V>
        └── java.util.HashMap<K,V>
              └── java.util.LinkedHashMap<K,V>
                implements Map<K,V>, Cloneable, Serializable

看清楚这棵树——LinkedHashMap 继承自 HashMap,不是平级关系。所以它拥有 HashMap 的所有能力(哈希表、扩容、红黑树),再加上自己额外维护的双向链表。

所在包

java.util —— 集合包,和 HashMap 是亲兄弟。

核心作用

相比于 HashMap,LinkedHashMap 有两大独门绝技

  1. 有序遍历 —— 维护了插入顺序(默认)或访问顺序
  2. LRU 缓存 —— 通过 removeEldestEntry() 方法,一行代码就能实现一个 LRU 缓存

许多框架底层都在用它:

  • MyBatis 的 LruCache
  • Spring 的某些缓存实现
  • 各种工具类的 LRUMap

2. 核心源码解析

2.1 节点结构

LinkedHashMap 没有自己的节点类,它复用了 HashMap 的 Node,然后加了一个带前后指针的 Entry 子类:

// LinkedHashMap 内部使用的节点,继承自 HashMap.Node
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);
    }
}

关键点:

  • before / after 就是双向链表的指针
  • 而这个 next 是 HashMap 的拉链法用的单链表指针
  • 一个节点 = 哈希表中的桶节点 + 双向链表中的节点,身兼两职

2.2 核心字段

public class LinkedHashMap<K,V> extends HashMap<K,V> {
    
    // 双向链表的头节点(最老的节点)
    transient LinkedHashMap.Entry<K,V> head;
    
    // 双向链表的尾节点(最新的节点)
    transient LinkedHashMap.Entry<K,V> tail;
    
    // 排序模式:true = 访问顺序,false = 插入顺序
    final boolean accessOrder;
}
  • head → 链头,最老的元素
  • tail → 链尾,最新的元素
  • accessOrder → 跟 LRU 相关,默认 false(插入顺序)

2.3 插入过程怎么维护链表?

LinkedHashMap 没有重写 put 方法,而是利用了 HashMap 留给子类的 三个钩子方法(Template Method 模式):

// 1. 创建新节点时调用——LinkedHashMap 重写为创建带链表的 Entry
Node<K,V> newNode(int hash, K key, V value, Node<K,V> e) {
    // 创建 LinkedHashMap.Entry
    LinkedHashMap.Entry<K,V> p = 
        new LinkedHashMap.Entry<>(hash, key, value, e);
    // 将 p 链接到双向链表的尾部
    linkNodeLast(p);
    return p;
}

// 2. 当红黑树节点转回链表时调用
Node<K,V> replacementNode(Node<K,V> p, Node<K,V> next) {
    // 保持链表连接
    LinkedHashMap.Entry<K,V> q = (LinkedHashMap.Entry<K,V>)p;
    LinkedHashMap.Entry<K,V> t = 
        new LinkedHashMap.Entry<>(q.hash, q.key, q.value, next);
    transferLinks(q, t);
    return t;
}

核心的 linkNodeLast 方法:

// 把节点追加到双向链表尾部
private void linkNodeLast(LinkedHashMap.Entry<K,V> p) {
    LinkedHashMap.Entry<K,V> last = tail;
    tail = p;           // 新节点成为尾节点
    if (last == null)
        head = p;       // 空的链表,头尾都是 p
    else {
        p.before = last;
        last.after = p; // 建立前后指向
    }
}

所以:你每次 put,HashMap 处理哈希表那一套(寻址、拉链/红黑树),而 LinkedHashMap 默默在链表尾部追加了一个节点

2.4 遍历原理——这就是有序的原因

当你 keySet().iterator() 时:

// LinkedHashMap 重写了 entrySet() 的迭代器
abstract class LinkedHashIterator {
    LinkedHashMap.Entry<K,V> next;  // 下一个节点
    LinkedHashMap.Entry<K,V> current; // 当前节点
    
    // 按照双向链表的顺序遍历,而不是哈希桶的顺序
    public final boolean hasNext() {
        return next != null;
    }
    
    final LinkedHashMap.Entry<K,V> nextNode() {
        LinkedHashMap.Entry<K,V> e = next;
        // ...
        current = e;
        next = e.after;  // 沿 after 指针走!按插入顺序
        return e;
    }
}

精髓:普通 HashMap 遍历要走整个哈希表数组,碰到空桶就跳过;而 LinkedHashMap 沿着 after 指针顺序走一遍,按插入顺序拿到所有元素,时间复杂度只有 O(n)。

2.5 访问顺序——LRU 的关键

accessOrder = true 时,每次 get() 会把被访问的节点移到链表尾部

public V get(Object key) {
    Node<K,V> e;
    if ((e = getNode(hash(key), key)) == null)
        return null;
    if (accessOrder)  // 访问顺序模式
        afterNodeAccess(e);  // 把 e 移到链表尾部
    return e.value;
}

afterNodeAccess 的核心逻辑:

void afterNodeAccess(Node<K,V> e) {
    LinkedHashMap.Entry<K,V> last;
    if (accessOrder && (last = tail) != e) {
        // 把 e 从链表的当前位置摘下来
        LinkedHashMap.Entry<K,V> p = 
            (LinkedHashMap.Entry<K,V>)e, b = p.before, a = p.after;
        p.after = null;
        if (b == null)
            head = a;
        else
            b.after = a;
        if (a != null)
            a.before = b;
        else
            last = b;
        // 将 e 放到链表尾部
        p.before = last;
        if (last != null)
            last.after = p;
        tail = p;
        // 维护 modCount
        ++modCount;
    }
}

简单理解:每次 get 都会把这个节点"提到"链表最后面。链表头部一直是最久没被访问的节点。

2.6 自动删最老元素——removeEldestEntry

// 默认返回 false,表示永不过期
protected boolean removeEldestEntry(Map.Entry<K,V> eldest) {
    return false;
}

这个钩子方法会在每次插入后被调用。如果能移除最老的元素,就自动执行

// HashMap.putVal 中最后调用的钩子
void afterNodeInsertion(boolean evict) {
    LinkedHashMap.Entry<K,V> first;
    // 如果 removeEldestEntry 返回 true → 删除头节点
    if (evict && (first = head) != null && removeEldestEntry(first)) {
        K key = first.key;
        removeNode(hash(key), key, nullfalsetrue);
    }
}

两行代码实现 LRU 缓存:

class LRUCache<K,V> extends LinkedHashMap<K,V> {
    private final int maxCapacity;
    
    public LRUCache(int maxCapacity) {
        super(maxCapacity, 0.75ftrue);  // accessOrder = true
        this.maxCapacity = maxCapacity;
    }
    
    @Override
    protected boolean removeEldestEntry(Map.Entry<K,V> eldest) {
        return size() > maxCapacity;  // 超过容量就删最老的
    }
}

3. 使用示例

3.1 插入顺序 vs 访问顺序

public class LinkedHashMapDemo {
    public static void main(String[] args) {
        // 插入顺序(默认)
        Map<String, Integer> insertOrder = new LinkedHashMap<>(160.75ffalse);
        
        // 访问顺序
        Map<String, Integer> accessOrder = new LinkedHashMap<>(160.75ftrue);
        
        // 插入同样的数据
        String[] keys = {"A""B""C""D""E"};
        for (String key : keys) {
            insertOrder.put(key, key.charAt(0) - 'A' + 1);
            accessOrder.put(key, key.charAt(0) - 'A' + 1);
        }
        
        System.out.println("=== 插入顺序 ===");
        insertOrder.forEach((k, v) -> System.out.print(k + " "));
        // 输出: A B C D E
        
        // 访问一下 B 和 D
        accessOrder.get("B");
        accessOrder.get("D");
        
        System.out.println("\n=== 访问顺序(B和D被访问后移到最后)===");
        accessOrder.forEach((k, v) -> System.out.print(k + " "));
        // 输出: A C E B D
    }
}

3.2 完整 LRU 缓存

class LRUCache<K,V> extends LinkedHashMap<K,V> {
    private final int maxCapacity;
    
    public LRUCache(int maxCapacity) {
        // 容量、负载因子、访问顺序模式
        super(maxCapacity, 0.75ftrue);
        this.maxCapacity = maxCapacity;
    }
    
    @Override
    protected boolean removeEldestEntry(Map.Entry<K,V> eldest) {
        return size() > maxCapacity;
    }
    
    public static void main(String[] args) {
        LRUCache<String, String> cache = new LRUCache<>(3);
        
        cache.put("1""A");
        cache.put("2""B");
        cache.put("3""C");
        System.out.println("初始: " + cache);  // {1=A, 2=B, 3=C}
        
        // 访问 1,它变成最新的
        cache.get("1");
        System.out.println("访问1: " + cache);  // {2=B, 3=C, 1=A}
        
        // 插入新的,最久未用的2会被淘汰
        cache.put("4""D");
        System.out.println("插入4: " + cache);  // {3=C, 1=A, 4=D}
        // 2 被移除了!
        
        // 再访问 3
        cache.get("3");
        System.out.println("访问3: " + cache);  // {1=A, 4=D, 3=C}
        
        // 插入5,淘汰最久未用的1
        cache.put("5""E");
        System.out.println("插入5: " + cache);  // {4=D, 3=C, 5=E}
    }
}

4. 注意事项

⚠️ 性能

  • LinkedHashMap 的 put/get 操作时间复杂度 O(1),与 HashMap 完全一样
  • 但多维护了双向链表,内存开销略大(多了两个指针 before/after)
  • 遍历比 HashMap 快得多(HashMap 需要遍历整个数组存在空桶,LinkedHashMap 只沿链表走)

⚠️ 线程安全

  • 不是线程安全的!多线程环境下用 Collections.synchronizedMap(new LinkedHashMap<>())
  • 或者用 ConcurrentSkipListMap 如果要求有序且并发

⚠️ LRU 缓存的坑

  • removeEldestEntry 的淘汰是被动触发的,只有 put 插入时才会检查
  • 如果你的业务有大量读操作,LRU 缓存的淘汰会延迟
  • 更完善的 LRU 要用 ConcurrentLinkedHashMap(Guava/Caffeine 那种)

⚠️ 红黑树节点的链表维护

  • 当桶中链表长度超过 8 转红黑树时,LinkedHashMap 需要额外处理 after/before 指针
  • JDK 8 通过 afterNodeAccess / afterNodeInsertion / afterNodeRemoval 三个钩子完美解决了

⚠️ equals 和 hashCode

  • LinkedHashMap 不要求 key 有序,所以依然靠 hashCode 定位桶
  • 和其他 Map 一样,key 必须正确实现 equals()hashCode()

5. 对比总结

特性 HashMap LinkedHashMap TreeMap
数据结构 数组+链表+红黑树 数组+链表+红黑树+双向链表 红黑树
迭代顺序 无序 插入顺序/访问顺序 自然顺序/Comparator
时间复杂度 O(1) O(1) O(log n)
空间开销 较低 中(多两个指针) 较高
实现 LRU ❌ 不支持 ✅ 一行代码 ❌ 不支持
线程安全
插入性能 最高 略低于HashMap 中等

总结

LinkedHashMap 是我个人非常喜欢的一个类——它用极小的代价(每个节点多两个指针),就实现了 HashMap 做不到的有序遍历和 LRU 缓存。Template Method 模式的经典应用(三个 afterNode* 钩子),代码写得干净漂亮。

当年我在公司写缓存方案时,面试官问我"你实现LRU准备用什么",我说了 LinkedHashMap,他直接说"可以了"。不是因为它性能最好,而是简单、够用、不出bug。很多时候,一个优雅的工具类胜过自己写的复杂算法。

下一篇预告:ReentrantLock —— JUC 包的锁之王,AQS 的经典实现

基本 文件 流程 错误 SQL 调试
  1. 请求信息 : 2026-06-08 11:10:48 HTTP/1.1 GET : https://www.yeyulingfeng.com/a/724357.html
  2. 运行时间 : 0.209257s [ 吞吐率:4.78req/s ] 内存消耗:4,710.73kb 文件加载:145
  3. 缓存信息 : 0 reads,0 writes
  4. 会话信息 : SESSION_ID=aac35d7b4f6b6f8289385aa1588393a5
  1. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/public/index.php ( 0.79 KB )
  2. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/autoload.php ( 0.17 KB )
  3. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/composer/autoload_real.php ( 2.49 KB )
  4. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/composer/platform_check.php ( 0.90 KB )
  5. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/composer/ClassLoader.php ( 14.03 KB )
  6. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/composer/autoload_static.php ( 6.05 KB )
  7. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-helper/src/helper.php ( 8.34 KB )
  8. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-validate/src/helper.php ( 2.19 KB )
  9. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/ralouphie/getallheaders/src/getallheaders.php ( 1.60 KB )
  10. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/helper.php ( 1.47 KB )
  11. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/stubs/load_stubs.php ( 0.16 KB )
  12. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Exception.php ( 1.69 KB )
  13. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-container/src/Facade.php ( 2.71 KB )
  14. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/symfony/deprecation-contracts/function.php ( 0.99 KB )
  15. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/symfony/polyfill-mbstring/bootstrap.php ( 8.26 KB )
  16. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/symfony/polyfill-mbstring/bootstrap80.php ( 9.78 KB )
  17. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/symfony/var-dumper/Resources/functions/dump.php ( 1.49 KB )
  18. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-dumper/src/helper.php ( 0.18 KB )
  19. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/symfony/var-dumper/VarDumper.php ( 4.30 KB )
  20. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/guzzlehttp/guzzle/src/functions_include.php ( 0.16 KB )
  21. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/guzzlehttp/guzzle/src/functions.php ( 5.54 KB )
  22. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/App.php ( 15.30 KB )
  23. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-container/src/Container.php ( 15.76 KB )
  24. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/psr/container/src/ContainerInterface.php ( 1.02 KB )
  25. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/provider.php ( 0.19 KB )
  26. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Http.php ( 6.04 KB )
  27. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-helper/src/helper/Str.php ( 7.29 KB )
  28. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Env.php ( 4.68 KB )
  29. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/common.php ( 0.03 KB )
  30. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/helper.php ( 18.78 KB )
  31. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Config.php ( 5.54 KB )
  32. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/alipay.php ( 3.59 KB )
  33. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/facade/Env.php ( 1.67 KB )
  34. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/app.php ( 0.95 KB )
  35. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/cache.php ( 0.78 KB )
  36. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/console.php ( 0.23 KB )
  37. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/cookie.php ( 0.56 KB )
  38. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/database.php ( 2.48 KB )
  39. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/filesystem.php ( 0.61 KB )
  40. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/lang.php ( 0.91 KB )
  41. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/log.php ( 1.35 KB )
  42. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/middleware.php ( 0.19 KB )
  43. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/route.php ( 1.89 KB )
  44. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/session.php ( 0.57 KB )
  45. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/trace.php ( 0.34 KB )
  46. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/view.php ( 0.82 KB )
  47. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/event.php ( 0.25 KB )
  48. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Event.php ( 7.67 KB )
  49. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/service.php ( 0.13 KB )
  50. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/AppService.php ( 0.26 KB )
  51. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Service.php ( 1.64 KB )
  52. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Lang.php ( 7.35 KB )
  53. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/lang/zh-cn.php ( 13.70 KB )
  54. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/initializer/Error.php ( 3.31 KB )
  55. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/initializer/RegisterService.php ( 1.33 KB )
  56. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/services.php ( 0.14 KB )
  57. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/service/PaginatorService.php ( 1.52 KB )
  58. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/service/ValidateService.php ( 0.99 KB )
  59. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/service/ModelService.php ( 2.04 KB )
  60. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-trace/src/Service.php ( 0.77 KB )
  61. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Middleware.php ( 6.72 KB )
  62. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/initializer/BootService.php ( 0.77 KB )
  63. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/Paginator.php ( 11.86 KB )
  64. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-validate/src/Validate.php ( 63.20 KB )
  65. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/Model.php ( 23.55 KB )
  66. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/model/concern/Attribute.php ( 21.05 KB )
  67. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/model/concern/AutoWriteData.php ( 4.21 KB )
  68. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/model/concern/Conversion.php ( 6.44 KB )
  69. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/model/concern/DbConnect.php ( 5.16 KB )
  70. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/model/concern/ModelEvent.php ( 2.33 KB )
  71. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/model/concern/RelationShip.php ( 28.29 KB )
  72. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-helper/src/contract/Arrayable.php ( 0.09 KB )
  73. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-helper/src/contract/Jsonable.php ( 0.13 KB )
  74. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/model/contract/Modelable.php ( 0.09 KB )
  75. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Db.php ( 2.88 KB )
  76. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/DbManager.php ( 8.52 KB )
  77. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Log.php ( 6.28 KB )
  78. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Manager.php ( 3.92 KB )
  79. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/psr/log/src/LoggerTrait.php ( 2.69 KB )
  80. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/psr/log/src/LoggerInterface.php ( 2.71 KB )
  81. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Cache.php ( 4.92 KB )
  82. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/psr/simple-cache/src/CacheInterface.php ( 4.71 KB )
  83. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-helper/src/helper/Arr.php ( 16.63 KB )
  84. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/cache/driver/File.php ( 7.84 KB )
  85. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/cache/Driver.php ( 9.03 KB )
  86. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/contract/CacheHandlerInterface.php ( 1.99 KB )
  87. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/Request.php ( 0.09 KB )
  88. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Request.php ( 55.78 KB )
  89. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/middleware.php ( 0.25 KB )
  90. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Pipeline.php ( 2.61 KB )
  91. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-trace/src/TraceDebug.php ( 3.40 KB )
  92. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/middleware/SessionInit.php ( 1.94 KB )
  93. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Session.php ( 1.80 KB )
  94. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/session/driver/File.php ( 6.27 KB )
  95. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/contract/SessionHandlerInterface.php ( 0.87 KB )
  96. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/session/Store.php ( 7.12 KB )
  97. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Route.php ( 23.73 KB )
  98. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/route/RuleName.php ( 5.75 KB )
  99. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/route/Domain.php ( 2.53 KB )
  100. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/route/RuleGroup.php ( 22.43 KB )
  101. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/route/Rule.php ( 26.95 KB )
  102. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/route/RuleItem.php ( 9.78 KB )
  103. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/route/app.php ( 3.94 KB )
  104. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/facade/Route.php ( 4.70 KB )
  105. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/route/dispatch/Controller.php ( 4.74 KB )
  106. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/route/Dispatch.php ( 10.44 KB )
  107. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/controller/Index.php ( 9.87 KB )
  108. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/BaseController.php ( 2.05 KB )
  109. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/facade/Db.php ( 0.93 KB )
  110. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/connector/Mysql.php ( 5.44 KB )
  111. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/PDOConnection.php ( 52.47 KB )
  112. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/Connection.php ( 8.39 KB )
  113. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/ConnectionInterface.php ( 4.57 KB )
  114. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/builder/Mysql.php ( 16.58 KB )
  115. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/Builder.php ( 24.06 KB )
  116. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/BaseBuilder.php ( 27.50 KB )
  117. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/Query.php ( 15.71 KB )
  118. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/BaseQuery.php ( 45.13 KB )
  119. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/TimeFieldQuery.php ( 7.43 KB )
  120. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/AggregateQuery.php ( 3.26 KB )
  121. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/ModelRelationQuery.php ( 20.07 KB )
  122. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/ParamsBind.php ( 3.66 KB )
  123. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/ResultOperation.php ( 7.01 KB )
  124. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/WhereQuery.php ( 19.37 KB )
  125. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/JoinAndViewQuery.php ( 7.11 KB )
  126. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/TableFieldInfo.php ( 2.63 KB )
  127. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/Transaction.php ( 2.77 KB )
  128. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/log/driver/File.php ( 5.96 KB )
  129. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/contract/LogHandlerInterface.php ( 0.86 KB )
  130. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/log/Channel.php ( 3.89 KB )
  131. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/event/LogRecord.php ( 1.02 KB )
  132. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-helper/src/Collection.php ( 16.47 KB )
  133. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/facade/View.php ( 1.70 KB )
  134. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/View.php ( 4.39 KB )
  135. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/controller/Es.php ( 3.30 KB )
  136. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Response.php ( 8.81 KB )
  137. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/response/View.php ( 3.29 KB )
  138. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Cookie.php ( 6.06 KB )
  139. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-view/src/Think.php ( 8.38 KB )
  140. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/contract/TemplateHandlerInterface.php ( 1.60 KB )
  141. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-template/src/Template.php ( 46.61 KB )
  142. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-template/src/template/driver/File.php ( 2.41 KB )
  143. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-template/src/template/contract/DriverInterface.php ( 0.86 KB )
  144. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/runtime/temp/c935550e3e8a3a4c27dd94e439343fdf.php ( 31.50 KB )
  145. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-trace/src/Html.php ( 4.42 KB )
  1. CONNECT:[ UseTime:0.001122s ] mysql:host=127.0.0.1;port=3306;dbname=wenku;charset=utf8mb4
  2. SHOW FULL COLUMNS FROM `fenlei` [ RunTime:0.001611s ]
  3. SELECT * FROM `fenlei` WHERE `fid` = 0 [ RunTime:0.001787s ]
  4. SELECT * FROM `fenlei` WHERE `fid` = 63 [ RunTime:0.002600s ]
  5. SHOW FULL COLUMNS FROM `set` [ RunTime:0.001442s ]
  6. SELECT * FROM `set` [ RunTime:0.000613s ]
  7. SHOW FULL COLUMNS FROM `article` [ RunTime:0.001518s ]
  8. SELECT * FROM `article` WHERE `id` = 724357 LIMIT 1 [ RunTime:0.001254s ]
  9. UPDATE `article` SET `lasttime` = 1780888248 WHERE `id` = 724357 [ RunTime:0.020013s ]
  10. SELECT * FROM `fenlei` WHERE `id` = 64 LIMIT 1 [ RunTime:0.000809s ]
  11. SELECT * FROM `article` WHERE `id` < 724357 ORDER BY `id` DESC LIMIT 1 [ RunTime:0.001215s ]
  12. SELECT * FROM `article` WHERE `id` > 724357 ORDER BY `id` ASC LIMIT 1 [ RunTime:0.001333s ]
  13. SELECT * FROM `article` WHERE `id` < 724357 ORDER BY `id` DESC LIMIT 10 [ RunTime:0.001664s ]
  14. SELECT * FROM `article` WHERE `id` < 724357 ORDER BY `id` DESC LIMIT 10,10 [ RunTime:0.005617s ]
  15. SELECT * FROM `article` WHERE `id` < 724357 ORDER BY `id` DESC LIMIT 20,10 [ RunTime:0.002173s ]
0.213115s