返回

轻松搞懂 LinkedHashMap 源码,快速掌握数据有序存储的奥秘

Android

LinkedHashMap 源码分析

前面对 HashMap 的源码做了分析,我们知道 HashMap 内部的数据结构是数组+单链表/红黑树实现的,这种数据结构是不能保证数据插入的有序性的,因为会对传入的 key 做 hash 运算,然后再做取模运算,通过链表指向的方法去存储数据,这样就导致了遍历数据的时候无法根据插入的顺序来遍历。

而 LinkedHashMap 则不同,它在 HashMap 的基础上做了改进,增加了对插入顺序的维护,使数据能够按照插入的先后顺序进行存储和遍历。

LinkedHashMap 的数据结构

LinkedHashMap 的数据结构与 HashMap 非常相似,也是由数组和链表/红黑树组成。但与 HashMap 不同的是,LinkedHashMap 在链表/红黑树中增加了一个额外的节点,称为 entry 节点。entry 节点不仅存储了 key-value 对,还存储了指向前后 entry 节点的指针。这样,就可以通过遍历 entry 节点来实现数据的有序存储和遍历。

LinkedHashMap 的工作原理

LinkedHashMap 的工作原理与 HashMap 非常相似。当向 LinkedHashMap 中插入数据时,首先会对 key 进行 hash 运算,然后做取模运算,得到一个数组下标。如果数组下标对应的链表/红黑树为空,则直接将数据插入到链表/红黑树中。否则,则遍历链表/红黑树,找到与 key 相同的 entry 节点,然后将数据插入到该 entry 节点之后。

当从 LinkedHashMap 中删除数据时,首先会对 key 进行 hash 运算,然后做取模运算,得到一个数组下标。如果数组下标对应的链表/红黑树为空,则直接返回 null。否则,则遍历链表/红黑树,找到与 key 相同的 entry 节点,然后将该 entry 节点从链表/红黑树中删除。

当遍历 LinkedHashMap 中的数据时,可以通过 entry 节点之间的指针来实现。从头结点开始,依次遍历每个 entry 节点,就可以按照插入的先后顺序来遍历数据。

LinkedHashMap 的应用场景

LinkedHashMap 在实际项目中有着广泛的应用场景,比如:

  • 缓存数据:LinkedHashMap 可以用来缓存数据,当需要访问数据时,可以先从 LinkedHashMap 中获取,如果找不到,再去数据库中查询。这样可以提高数据的访问速度。
  • 实现 LRU 算法:LinkedHashMap 可以用来实现 LRU 算法(最近最少使用算法),该算法可以根据数据的访问频率来淘汰数据,从而保证缓存中存储的数据是最常用的数据。
  • 实现 FIFO 算法:LinkedHashMap 可以用来实现 FIFO 算法(先进先出算法),该算法可以按照数据的插入顺序来淘汰数据,从而保证缓存中存储的数据是最早插入的数据。
  • 有序存储数据:LinkedHashMap 可以用来存储有序的数据,比如日志数据、交易记录等。

总结

LinkedHashMap 是一种非常实用的数据结构,它不仅具有 HashMap 的快速检索性能,还能保证数据的有序性。在实际项目中,LinkedHashMap 有着广泛的应用场景,比如缓存数据、实现 LRU 算法、实现 FIFO 算法等。